Esamina l'esametro dattilico in un puzzle unico


10

Come terribile studente di latino per diversi anni ho imparato a odiare molte cose sul latino. Tuttavia c'è una cosa che amo.

Espansione latina.

Scansion è l'atto di determinare il metro di una particolare linea di poesie. Per il latino questo significa delimitare ogni sillaba nella riga come "leggera" o "pesante".

In latino la scansione ha molte regole. Tuttavia, diversamente dall'inglese, la scansione latina è abbastanza regolare e spesso non richiede alcuna conoscenza del vocabolario o della grammatica latina. Per questo problema useremo un sottoinsieme semplificato di quelle regole (il vero latino non ha specifiche precise).

Prima di iniziare la scansione devi sfuggire . Elision è la sillaba che cade tra le parole per facilitare la pronuncia. (es. "lui è" -> "lui"). A differenza dell'inglese, l'elezione latina segue regole molto buone.

  • La vocale finale di una parola che termina con una vocale viene omessa se la parola successiva inizia con una vocale.

    NAUTA EST -> NAUTEST

  • Lo stesso vale per le parole che terminano con una vocale seguita da "m".

    FIDUM AGRICOLAM -> FIDAGRICOLAM

  • La parola "h" iniziale, seguita da una vocale, conta come una singola vocale ai fini dell'elisione e viene sempre rilasciata quando viene eletta.

    MULTAE HORAE -> MULTORAE

    o

    MULTAM HORAM -> MULTORAM

Dopo l'elisione possiamo iniziare la scansione. La scansione viene eseguita su un contatore specifico. Il metro per questa sfida è l'esametro dattilico . L'esametro dattilico ha sei "piedi" ogni piede è costituito da due o tre sillabe. Le sillabe possono essere lunghe o corte a seconda della vocale. Ognuno dei primi cinque piedi sarà o un dattilo, una lunga sillaba seguita da due brevi, o una sponda, due lunghe sillabe. E l'ultimo piede sarà un lungo seguito da un anceps (corto o lungo, per questo problema non dovrai determinare quale).

  • Una vocale in latino può essere corta o lunga

  • Una "i" inserita tra due vocali (ad es. Eiectum) è una consonante. (ovvero una "j")

  • Una "i" che inizia una parola seguita da una vocale (ad es. Iactus) è anche una consonante

  • Una "u" dopo una "q" è anche una consonante (cioè una "v")

  • I dittonghi (ae, au, ei, eu, oe e ui) sono composti da due vocali ma contano come una vocale e sono sempre lunghi

  • Una vocale con due o più consonanti tra essa e la vocale successiva è sempre lunga

  • Per la regola precedente, una "l" o una "r" dopo una "b", "c", "d", "g", "p" o "t" non contano come consonanti

  • "x" conta come due consonanti

  • "ch", "ph", "th" e "qu" contano come una consonante

  • La sillaba "que" alla fine di una parola (dopo l'elisione) è sempre breve

  • Se una vocale non è forzata da una delle regole precedenti, può essere lunga o corta a seconda del contatore

Il tuo compito sarà quello di prendere una linea di latino e produrne la scansione. Accoglierai la linea come stringa tramite l'input standard e otterrai una stringa che rappresenta lo scansionamento finale.

L'input conterrà solo spazi e caratteri AZ.

Per rappresentare lo scansionamento emetterai tutte le sillabe con |demarcazione della separazione dei piedi. Una lunga sillaba sarà rappresentata da un -breve mentre una breve sillaba sarà contrassegnata da una ve un anceps (l'ultima sillaba di ogni riga) sarà contrassegnato da una x. Se ci sono più soluzioni, come spesso accade, è possibile produrre qualcuno di loro.

Casi test

L'inizio dell'Eneide di Virgilio.

 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

Ulteriori stipulazioni

Nella maniera corretta della poesia latina, tutte le risposte devono iniziare con un'invocazione alle muse .

Il latino ha solo due parole di una lettera "e" e "a". Si può presumere che nessun'altra parola di una lettera apparirà come input.


2
Oddio, questo riporta alla memoria ...
ThreeFx

1
Una "i" che procede in un'altra vocale è una consonante (cioè una "j"). In Lavinjaque ( --vv) lo è, ma in Italiam ( -vv-) nello stesso verso non lo è. Forse hai inserito Js nell'input? Hai davvero una soluzione funzionante che genera questo output?
Lynn,

Oh, il penultimo piede è sempre un dattilo, in modo classico. È necessario specificare se le risposte possono assumerlo.
Lynn,

@Lynn Dato che il penultimo piede non è sempre un dattilo, l'ho lasciato intenzionalmente ambiguo. Può essere uno dei due.
Ad Hoc Garf Hunter

@Dave 1) si hai ragione 2) Deve terminare l'intera parola.
Risolverò

Risposte:


5

sed, 402 392 374 359 363 334 333 byte

“Canta, dea, la rabbia del figlio di Peleo Achilleo e la sua devastazione, che ha causato dolori mille volte agli Achiani, scagliati nella loro moltitudine alla casa dell'Ade forti anime di eroi, ma ha dato ai loro corpi la delicata festa dei cani, di tutti gli uccelli, e la volontà di Zeus fu compiuta da quel momento in cui per la prima volta si trovò nella divisione del conflitto il figlio di Atreo, il signore degli uomini e il geniale Achilleus. "

- Omero (L'Iliade); confuso perché questa citazione è qui? controlla le regole.

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'

Non esattamente golf, ma questo implementa tutte le regole date sotto forma di espressioni regolari, che sed corre uno per uno per raggiungere la soluzione. Questo gestisce ogni linea in modo indipendente, quindi può elaborare un intero ingresso multi-linea.

Uso:

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 '<...>';

Abbattersi:

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
"

Risultati per casi di test:

-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

Vale la pena notare che ottengo risultati diversi per i casi di test 2 e 3, che sembrano essere soluzioni alternative non incluse nella domanda. Potrebbe essere che ho frainteso una regola però.
Dave,

Non credo che la tua scansione per il test case 2 funzioni. L'ultima "U" in "PROFUGUS" deve essere lunga perché ci sono due consonanti ("S" e "L") prima della vocale successiva. Nel tuo scansionamento hai poco. Sto controllando il terzo ora. Bella risposta comunque :)
Ad Hoc Garf Hunter

@WheatWizard ah ok, quella era una regola di cui mi stavo chiedendo (avrei dovuto chiedere) - l'ho preso per significare 2 consonanti senza spazi . Abbastanza facile da risolvere. Pubblicherò presto un aggiornamento.
Dave,

Sembra che avessi anche un bug in cui vccvccvsarebbe diventato -??invece --?- risolto ora. Sembra che sia d'accordo con i tuoi campioni su tutti tranne il caso n. 2 ora.
Dave,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.