Escanea el hexámetro dactílico en un rompecabezas único

10

Como terrible estudiante de latín durante varios años, he aprendido a odiar muchas cosas sobre el latín. Sin embargo, hay una cosa que amo.

Scansion latina.

La escansión es el acto de determinar el metro de una línea particular de poesía. Para el latín, esto significa demarcar cada sílaba en la línea como "ligera" o "pesada".

En latín la escansión tiene muchas reglas. Sin embargo, a diferencia del inglés, la extensión latina es bastante regular y, a menudo, no requiere conocimiento de vocabulario o gramática latina para ser ejecutada. Para este problema, utilizaremos un subconjunto simplificado de esas reglas (el latín real no tiene una especificación clara).

Antes de comenzar la escalada debes eludir . Elision es la caída de sílabas entre palabras para facilitar la pronunciación. (por ejemplo, "él es" -> "él es"). A diferencia del inglés, la elisión latina sigue reglas muy agradables.

  • La vocal final de una palabra que termina con una vocal se omite si la siguiente palabra comienza con una vocal.

    NAUTA EST -> NAUTEST

  • Lo mismo ocurre con las palabras que terminan en una vocal seguida de "m".

    FIDAGRICOLAM FIDUM -> FIDAGRICOLAM

  • La palabra "h" inicial seguida de una vocal cuenta como una sola vocal para propósitos de elisión y siempre se descarta cuando se elide.

    MULTAE HORAE -> MULTORAE

    o

    MULTAM HORAM -> MULTORAM

Después de la elisión podemos comenzar la tensión. La escala se realiza a un medidor específico. El medidor para este desafío es el hexámetro dactílico . El hexámetro dactílico tiene seis "pies" cada pie consta de dos o tres sílabas. Las sílabas pueden ser largas o cortas dependiendo de la vocal. Cada uno de los primeros cinco pies será un dactyl, una sílaba larga seguida de dos cortos, o un esponde, dos sílabas largas. Y el último pie será un largo seguido de un anceps (corto o largo, para este problema no tendrá que determinar cuál).

  • Una vocal en latín puede ser corta o larga

  • Una "i" intercalada entre dos vocales (por ejemplo, eiectum) es una consonante. (es decir, una "j")

  • Una "i" que comienza una palabra seguida de una vocal (por ejemplo, Iactus) también es una consonante

  • Una "u" después de una "q" también es una consonante (es decir, una "v")

  • Los diptongos (ae, au, ei, eu, oe y ui) están formados por dos vocales pero cuentan como una vocal y siempre son largas

  • Una vocal con dos o más consonantes entre ella y la siguiente vocal siempre es larga.

  • Para la regla anterior, una "l" o una "r" después de una "b", "c", "d", "g", "p" o "t" no cuentan como consonantes

  • "x" cuenta como dos consonantes

  • "ch", "ph", "th" y "qu" cuentan como una consonante

  • La sílaba "que" al final de una palabra (después de la elisión) siempre es corta

  • Si una vocal no es forzada por una de las reglas anteriores, puede ser larga o corta, esto dependerá del medidor

Su tarea será tomar una línea de latín y producir su extensión. Tomará la línea como una cadena a través de la entrada estándar y generará una cadena que representa la escala final.

La entrada contendrá solo espacios y caracteres AZ.

Para representar la escala, generará todas las sílabas con la |demarcación de la separación de pies. Una sílaba larga estará representada por un -tiempo, una sílaba corta estará marcada por vay un anceps (la última sílaba de cada línea) estará marcado por a x. Si hay varias soluciones, como a menudo las habrá, puede enviar cualquiera de ellas.

Casos de prueba

El comienzo de la Eneida de 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

Estipulaciones adicionales

En la forma correcta de la poesía latina, todas las respuestas deben comenzar con una invocación a las musas .

El latín tiene solo dos palabras de una letra "e" y "a". Puede suponer que no aparecerán otras palabras de una letra como entrada.

Ad Hoc Garf Hunter
fuente
2
Oh dios, esto trae recuerdos ...
ThreeFx
1
Una "i" que procede de otra vocal es una consonante (es decir, una "j"). En Lavinjaque ( --vv) lo es, pero en Italiam ( -vv-) en el mismo verso no lo es. Tal vez poner Js en la entrada? ¿Realmente tiene una solución de trabajo que genera esta salida?
Lynn
Oh, el penúltimo pie siempre es un dactyl, clásico. Debe especificar si las respuestas pueden suponer que sí.
Lynn
@ Lynn Dado que el penúltimo pie no siempre es un dactyl, lo he dejado ambiguo intencionalmente. Puede ser cualquiera.
Ad Hoc Garf Hunter
@Dave 1) sí, tienes razón 2) Debe terminar la palabra completa. Los arreglaré en breve
Ad Hoc Garf Hunter

Respuestas:

5

sed, 402 392 374 359 363 334 333 bytes

"Canta, diosa, la ira del hijo de Peleo, Achilleus, y su devastación, que afectó a los Achians mil veces, arrojó en sus multitudes a la casa de Hades fuertes almas de héroes, pero dio a sus cuerpos la delicada fiesta de los perros, de todas las aves, y la voluntad de Zeus se cumplió desde esa época, cuando por primera vez había una división del conflicto, el hijo de Atreus, el señor de los hombres y el brillante Achilleus.

- Homero (La Ilíada); confundido por qué esta cita está aquí? Revisa las reglas.

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'

No es exactamente golf, pero esto implementa todas las reglas dadas en forma de expresiones regulares, que se ejecutan una por una para llegar a la solución. Esto maneja cada línea de forma independiente, por lo que puede procesar una entrada completa de varias líneas.

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

Descompostura:

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 prueba:

-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
fuente
Vale la pena señalar que obtengo resultados diferentes para los casos de prueba 2 y 3, que parecen ser soluciones alternativas no incluidas en la pregunta. Sin embargo, podría ser que malinterpreté una regla.
Dave
No creo que su escasez para el caso de prueba 2 funcione. La última "U" en "PROFUGUS" debe ser larga porque hay dos consonantes ("S" y "L") antes de la próxima vocal. En tu escansión lo tienes corto. Estoy revisando el tercero ahora. Buena respuesta de todos modos :)
Ad Hoc Garf Hunter
@WheatWizard ah ok, esa era una regla sobre la que me preguntaba (debería haber preguntado) - Lo tomé como 2 consonantes sin espacios . Suficientemente fácil de arreglar. Publicaré una actualización pronto.
Dave
Parece que también tuve un error donde vccvccvse convertiría en -??lugar de --?- arreglado ahora. Parece que está de acuerdo con sus muestras en todos los casos, excepto el caso # 2 ahora.
Dave