Digitalize o hexâmetro dactílico em um quebra-cabeça único

10

Como um terrível aluno de latim por vários anos, aprendi a odiar muitas coisas sobre o latim. No entanto, há uma coisa que eu amo.

Digitalização em latim.

Escansão é o ato de determinar o medidor de uma determinada linha de poesia. Para o latim, isso significa demarcar cada sílaba na linha como "leve" ou "pesada".

Em latim, a escansão tem muitas regras. No entanto, diferentemente do inglês, a escansão do latim é bastante regular e geralmente não requer conhecimento do vocabulário ou gramática do latim para ser realizada. Para esse problema, usaremos um subconjunto simplificado dessas regras (o latim real não possui uma especificação precisa).

Antes de começar a escansão, você deve fugir . Elision são as sílabas que caem entre as palavras para facilitar a pronúncia. (por exemplo, "ele é" -> "ele é"). Ao contrário do inglês, a elisão latina segue regras muito boas.

  • A vogal final de uma palavra que termina com uma vogal é omitida se a próxima palavra começar com uma vogal.

    NAUTA EST -> NAUTEST

  • O mesmo vale para as palavras que terminam em uma vogal seguida de "m".

    FIDUM AGRICOLAM -> FIDAGRICOLAM

  • A palavra inicial "h" seguida de uma vogal conta como uma vogal única para fins de elisão e é sempre descartada quando é elidida.

    MULTAE HORAE -> MULTORAE

    ou

    MULTAM HORAM -> MULTORAM

Após a elisão, podemos começar a escansão. A digitalização é feita para um medidor específico. O medidor para esse desafio é o hexâmetro dactílico . O hexâmetro dactílico tem seis "pés", cada pé consiste em duas ou três sílabas. As sílabas podem ser longas ou curtas, dependendo da vogal. Cada um dos primeiros cinco pés será um dáctilo, uma sílaba longa seguida por duas curtas, ou uma esponja, duas sílabas longas. E o último pé será um longo seguido de um anceps (curto ou longo, para esse problema, você não precisará determinar qual).

  • Uma vogal em latim pode ser curta ou longa

  • Um "i" imprensado entre duas vogais (por exemplo, eiectum) é uma consoante. (ou seja, um "j")

  • Um "i" que inicia uma palavra seguida por uma vogal (por exemplo, Iactus) também é uma consoante

  • Um "u" depois de um "q" também é uma consoante (ou seja, um "v")

  • Os ditongos (ae, au, ei, eu, oe e ui) são compostos de duas vogais, mas contam como uma vogal e são sempre longos

  • Uma vogal com duas ou mais consoantes entre ela e a próxima vogal é sempre longa

  • Para a regra anterior, "l" ou "r" após "b", "c", "d", "g", "p" ou "t" não contam como consoante

  • "x" conta como duas consoantes

  • "ch", "ph", "th" e "qu" contam como uma consoante

  • A sílaba "que" no final de uma palavra (após elisão) é sempre curta

  • Se uma vogal não for forçada por uma das regras anteriores, ela pode ser longa ou curta, isso depende do medidor

Sua tarefa será pegar uma linha de latim e produzir a escansão dela. Você entrará na linha como sequência via entrada padrão e produzirá uma sequência representando a varredura final.

A entrada conterá apenas espaços e caracteres AZ.

Para representar a escansão, você produzirá todas as sílabas com a |demarcação da separação dos pés. Uma sílaba longa será representada por um -tempo, enquanto uma sílaba curta será marcada por a ve um anceps (a última sílaba de cada linha) será marcado por a x. Se houver várias soluções, como sempre haverá, você poderá produzir qualquer uma delas.

Casos de teste

O início da Eneida de Virgílio.

 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

Outras estipulações

Da maneira apropriada da poesia latina, todas as respostas devem começar com uma invocação às musas .

O latim possui apenas duas palavras de uma letra "e" e "a". Você pode supor que nenhuma outra palavra de uma letra aparecerá como entrada.

Caçador Ad Hoc Garf
fonte
2
Oh, Deus, isso traz de volta memórias ...
ThreeFx 02/02
11
Um "i" prosseguindo com outra vogal é uma consoante (isto é, um "j"). Em Lavinjaque ( --vv) é, mas em Italiam ( -vv-) no mesmo verso não é. Talvez colocar Js na entrada? Você realmente tem uma solução funcional gerando essa saída?
Lynn
Oh, o penúltimo pé é sempre um dactyl, classicamente. Você deve especificar se as respostas podem assumir isso.
Lynn
@ Lynn Como o penúltimo pé nem sempre é um dactilo, deixei-o intencionalmente ambíguo. Pode ser também.
Ad Hoc Garf Hunter
@ Dave 1) Sim, você está certo 2) Deve terminar a palavra inteira. Vou corrigir estes logo
Ad Hoc Garf Hunter

Respostas:

5

sed, 402 392 374 359 363 334 333 bytes

“Cante, deusa, a raiva do filho de Peleus, Achilleus, e sua devastação, que causou um sofrimento mil vezes maior aos achianos, lançadas em multidões à casa de Hades, fortes almas de heróis, mas deram seus corpos para o delicado banquete dos cães, de todos os pássaros, e a vontade de Zeus foi cumprida desde aquele tempo em que pela primeira vez houve divisão de conflitos, filho de Atreus, o senhor dos homens e brilhante Achilleus. ”

- Homero (A Ilíada); confuso por que esta citação está aqui? verifique as regras.

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'

Não é exatamente um jogador de golfe, mas isso implementa todas as regras fornecidas na forma de expressões regulares, que são executadas uma a uma para chegar à solução. Isso lida com cada linha independentemente, para que possa processar uma entrada inteira de várias linhas.

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

Demolir:

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
"

Resultados para casos de teste:

-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
fonte
Vale ressaltar que obtenho resultados diferentes para os casos de teste 2 e 3, que parecem ser soluções alternativas não incluídas na pergunta. Pode ser que eu tenha interpretado mal uma regra.
Dave
Não acho que sua varredura para o caso de teste 2 funcione. O último "U" em "PROFUGUS" deve ser longo porque há duas consoantes ("S" e "L") antes da próxima vogal. Em sua escansão, você tem uma curta. Estou verificando o terceiro agora. Agradável resposta de qualquer maneira :)
Ad Hoc Garf Hunter
@ WheatWizard ah ok, essa era uma regra que eu estava pensando (deveria ter perguntado) - eu entendi duas consoantes sem espaços . Fácil o suficiente para consertar. Vou postar uma atualização em breve.
Dave
Parece que eu também tive um bug onde vccvccvse tornaria, em -??vez de --?- corrigido agora. Parece que concorda com suas amostras em todos os casos, exceto o número 2 agora.
Dave