Zeskanuj daktylowy heksametr w unikalnej układance

10

Jako straszny student łaciny od kilku lat nauczyłem się nienawidzić wielu rzeczy związanych z łaciną. Jest jednak jedna rzecz, którą kocham.

Łacińska rezydencja.

Rozcięcie to czynność polegająca na określeniu miernika określonej linii poezji. W przypadku łaciny oznacza to wytyczenie każdej sylaby w linii jako „lekkiej” lub „ciężkiej”.

Po łacinie scansion ma wiele zasad. Jednak w przeciwieństwie do angielskiego, łacińska wersja językowa jest dość regularna i często nie wymaga znajomości słownictwa łacińskiego ani gramatyki. Do tego problemu użyjemy uproszczonego podzbioru tych reguł (prawdziwa łacina nie ma schludnej specyfikacji).

Zanim rozpoczniesz posiadanie, musisz uciec . Elision to pomijane sylaby między słowami w celu ułatwienia wymowy. (np. „on” -> „on”). W przeciwieństwie do angielskiego, elity łacińskie przestrzegają bardzo fajnych zasad.

  • Ostatnia samogłoska słowa kończącego się samogłoską jest pomijana, jeśli następne słowo zaczyna się od samogłoski.

    NAUTA EST -> NAUTEST

  • To samo dotyczy słów kończących się samogłoską, po której następuje „m”.

    FIDUM AGRICOLAM -> FIDAGRICOLAM

  • Początkowa wyraz „h”, po której następuje samogłoska, jest liczona jako pojedyncza samogłoska do celów elekcji i zawsze jest pomijana po elucji.

    HORAE MULTAE -> MULTORAE

    lub

    MULTAM HORAM -> MULTORAM

Po elekcji możemy rozpocząć rozbudowę. Skalowanie odbywa się do określonego miernika. Miernikiem tego wyzwania jest heksametr daktylowy . Heksametr daktylowy ma sześć „stóp”, każda stopa składa się z dwóch lub trzech sylab. Sylaby mogą być długie lub krótkie w zależności od samogłoski. Każda z pierwszych pięciu stóp będzie albo daktylem, długą sylabą, po której następują dwie krótkie, albo spondee, dwoma długimi sylabami. A ostatnią stopą będzie długi, a następnie anceps (krótki lub długi, w przypadku tego problemu nie będziesz musiał określić, który).

  • Samogłoska po łacinie może być krótka lub długa

  • „I” umieszczone między dwiema samogłoskami (np. Eiectum) jest spółgłoską. (tj. „j”)

  • „I” rozpoczynające słowo po samogłosce (np. Iactus) jest również spółgłoską

  • „U” po „q” jest również spółgłoską (tj. „V”)

  • Diphthongi (ae, au, ei, eu, oe i ui) składają się z dwóch samogłosek, ale liczą się jako jedna samogłoska i zawsze są długie

  • Samogłoska z dwiema lub więcej spółgłosek między nią a następną samogłoską jest zawsze długa

  • Dla poprzedniej reguły litera „l” lub „r” po „b”, „c”, „d”, „g”, „p” lub „t” nie są liczone jako spółgłoska

  • „x” liczy się jako dwie spółgłosek

  • „ch”, „ph”, „th” i „qu” liczą się jako jedna spółgłoska

  • Sylaba „que” na końcu słowa (po wymowie) jest zawsze krótka

  • Jeśli samogłoska nie jest wymuszona przez jedną z poprzednich reguł, może być długa lub krótka, zależy to od licznika

Twoim zadaniem będzie wzięcie linii łacińskiej i stworzenie jej rozszerzenia. Weźmiesz wiersz jako ciąg znaków za pomocą standardowego wejścia i wyprowadzisz ciąg reprezentujący końcową podziałkę.

Dane wejściowe będą zawierać tylko spacje i znaki AZ.

Aby przedstawić rozpiętość, wypiszesz wszystkie sylaby z |rozgraniczeniem oddzielenia stóp. Długa sylaba będzie reprezentowana przez -chwilę, a krótka sylaba będzie oznaczona a, va anceps (ostatnia sylaba każdej linii) będzie oznaczony przez x. Jeśli istnieje wiele rozwiązań, które często będą, możesz wydrukować dowolne z nich.

Przypadki testowe

Początek Eneidy Wergiliusza.

 ARMA VIRUMQUE CANO TROIAE QUI PRIMUS AB ORIS     -> -vv|-vv|--|--|-vv|-x (or -vv|-vv|--|-vv|--|-x)
 ITALIAM FATO PROFUGUS LAVINIAQUE VENIT           -> -vv|--|-vv|-vv|-vv|-x
 LITORA MULTUM ILLE ET TERRIS IACTATUS ET ALTO    -> -vv|--|--|--|-vv|-x
 VI SUPERUM SAEVAE MEMOREM IUNONIS OB IRAM        -> -vv|--|-vv|--|-vv|-x (or -vv|--|-vv|-vv|--|-x)
 MULTA QUOQUE ET BELLO PASSUS DUM CONDERET URBEM  -> -vv|--|--|--|-vv|-x
 INFERRETQUE DEOS LATIO GENUS UNDE LATINUM        -> --|-vv|-vv|-vv|-vv|-x
 ALBANIQUE PATRES ATQUE ALTAE MOENIA ROMAE        -> --|-vv|--|--|-vv|-x

Dalsze postanowienia

W odpowiedni sposób poezji łacińskiej wszystkie odpowiedzi muszą zaczynać się od inwokacji do muz .

Łacińska ma tylko dwa jednuliterowe słowa „e” i „a”. Możesz założyć, że żadne inne jednuliterowe słowa nie pojawią się jako dane wejściowe.

Ad Hoc Garf Hunter
źródło
2
O Boże, to przywraca wspomnienia ...
ThreeFx
1
„I” poprzedzające inną samogłoskę jest spółgłoską (tj. „J”). W Lavinjaque ( --vv) jest, ale w Italiam ( -vv-) w tym samym wersecie tak nie jest. Może wstawić Js na wejściu? Czy faktycznie masz działające rozwiązanie generujące ten wynik?
Lynn,
Och, klasycznie przedostatnia stopa jest zawsze daktylem. Powinieneś określić, czy odpowiedzi mogą tak zakładać.
Lynn,
@ Lynn Ponieważ przedostatnia stopa nie zawsze jest daktylem, celowo pozostawiłem ją niejednoznaczną. Może być albo.
Ad Hoc Garf Hunter
@Dave 1) tak masz rację 2) Musi kończyć całe słowo. Naprawię je wkrótce
Ad Hoc Garf Hunter

Odpowiedzi:

5

sed, 402 392 374 359 363 334 333 bajty

„Śpiewajcie, boginio, gniew syna Peleusza Achilleusza i jego dewastację, która bolała tysiąca Achian, rzuciła się w tłumie do domu Hadesu silnych dusz bohaterów, ale dała ciałom delikatne ucztowanie psów, wszystkich ptaków, a wola Zeusa wypełniła się od tego czasu, gdy po raz pierwszy stanął w podziale konfliktu syn Atreusza, pan ludzi i genialny Achilleus. ”

- Homer (Iliada); mylić, dlaczego ten cytat jest tutaj? sprawdź zasady.

sed -E 's/[AEIOU]M? H?([AEIOU])/\1/g;s/X/cc/g;s/(^|[ AEIOU])I([AEIOU])/\1c\2/g;s/QUE( |$)/cv/g;s/A[EU]|E[IU]|OE|UI/-/g;s/[CPT]H|[BCDGPT][LR]|QU|[^-vAEIOU ]/c/g;s/ //g;s/ucc+/-/g;s/c//g;s/^[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u]([-u]|[vu]{2})[-u].$/-\1|-\2|-\3|-\4|-\5|-x/;s/[uv]/-/g;s/---/-vv/g'

Nie do końca grał w golfa, ale to implementuje wszystkie podane reguły w postaci wyrażeń regularnych, które po prostu uruchamiają jeden po drugim, aby osiągnąć rozwiązanie. To obsługuje każdą linię niezależnie, więc może przetwarzać całe wejście wieloliniowe.

Stosowanie:

printf 'ARMA VIRUMQUE CANO TROIAE QUI PRIMUS AB ORIS
ITALIAM FATO PROFUGUS LAVINIAQUE VENIT
LITORA MULTUM ILLE ET TERRIS IACTATUS ET ALTO
VI SUPERUM SAEVAE MEMOREM IUNONIS OB IRAM
MULTA QUOQUE ET BELLO PASSUS DUM CONDERET URBEM
INFERRETQUE DEOS LATIO GENUS UNDE LATINUM
ALBANIQUE PATRES ATQUE ALTAE MOENIA ROMAE' | sed -E '<...>';

Awaria:

sed -E "
# Apply Elision
 s/[AEIOU]M? H?([AEIOU])/\1/g;

# Convert into vowels (u, v or -) and consonants (c) according to the rules given
 s/X/cc/g;
 s/(^|[ AEIOU])I([AEIOU])/\1c\2/g;
 s/QUE( |\$)/cv/g;
 s/A[EU]|E[IU]|OE|UI/-/g;
 s/[CPT]H|[BCDGPT][LR]|QU|[^-vAEIOU ]/c/g;
 s/[A-Z]/u/g; # all remaining vowels are unknown

# Remove all spaces
 s/ //g;

# A vowel followed by 2 consonants before the next vowel is long
# (and we don't care if the last vowel is long or short)
 s/ucc+/-/g;

# Remove all consonants
 s/c//g;

# Look for a matching dactylic hexameter and insert pipe separators
 s/^\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u]([-u]|[vu]{2})\
[-u].\$/-\1|-\2|-\3|-\4|-\5|-x/;

# Substitute identified feet with the necessary long/short vowels
 s/[uv]/-/g;
 s/---/-vv/g
"

Wyniki dla przypadków testowych:

-vv|-vv|--|--|-vv|-x
-vv|-vv|--|-vv|-vv|-x
-vv|--|--|--|-vv|-x
-vv|--|-vv|-vv|--|-x
-vv|--|--|--|-vv|-x
--|-vv|-vv|-vv|-vv|-x
--|-vv|--|--|-vv|-x
Dave
źródło
Warto zauważyć, że otrzymuję różne wyniki dla przypadków testowych 2 i 3, które wydają się być alternatywnymi rozwiązaniami nieuwzględnionymi w pytaniu. Możliwe, że jednak źle zinterpretowałem regułę.
Dave
Nie wydaje mi się, aby twój zakres dla przypadku testowego 2 działał. Ostatnie „U” w „PROFUGUS” musi być długie, ponieważ przed następną samogłoską są dwie spółgłosek („S” i „L”). W twojej posiadłości masz krótko. Sprawdzam teraz trzeci. W każdym razie
fajna
@WheatWizard ah ok, to była zasada, o której zastanawiałem się (powinienem zapytać) - wziąłem to za 2 spółgłoski bez spacji . Łatwo to naprawić. Wkrótce opublikuję aktualizację.
Dave
Wygląda na to, że miałem również błąd, który vccvccvstałby się -??zamiast --?- teraz naprawiony. Wygląda na to, że zgadza się teraz z twoimi próbkami we wszystkich przypadkach oprócz 2.
Dave