Scannez l'hexamètre dactylique dans un puzzle unique

10

En tant que terrible étudiant latin depuis plusieurs années, j'ai appris à détester beaucoup de choses sur le latin. Mais il y a une chose que j'aime.

Scansion latine.

La scansion est l'acte de déterminer le mètre d'une ligne de poésie particulière. Pour le latin, cela signifie délimiter chaque syllabe de la ligne comme "légère" ou "lourde".

En latin, la scansion a beaucoup de règles. Cependant, contrairement à l'anglais, la scansion latine est assez régulière et ne nécessite souvent aucune connaissance du vocabulaire ou de la grammaire latine. Pour ce problème, nous utiliserons un sous-ensemble simplifié de ces règles (le vrai latin n'a pas de spécification nette).

Avant de commencer la scansion, vous devez vous élider . Elision est la suppression des syllabes entre les mots pour faciliter la prononciation. (par exemple "il est" -> "il"). Contrairement à l'anglais, l'élision latine suit de très belles règles.

  • La voyelle finale d'un mot se terminant par une voyelle est omise si le mot suivant commence par une voyelle.

    NAUTA EST -> NAUTEST

  • Il en va de même pour les mots se terminant par une voyelle suivi de "m".

    FIDUM AGRICOLAM -> FIDAGRICOLAM

  • Le mot "h" initial du mot suivi d'une voyelle compte comme une voyelle unique à des fins d'élision et est toujours supprimé lorsqu'il est élidé.

    MULTAE HORAE -> MULTORAE

    ou

    MULTAM HORAM -> MULTORAM

Après l'élision, nous pouvons commencer la scansion. La mise à l'échelle est effectuée sur un compteur spécifique. Le compteur pour ce défi est l' hexamètre dactylique . L'hexamètre dactylique a six "pieds" chaque pied se compose de deux ou trois syllabes. Les syllabes peuvent être longues ou courtes selon la voyelle. Chacun des cinq premiers pieds sera soit un dactyle, une longue syllabe suivie de deux courtes, soit une spondée, deux longues syllabes. Et le dernier pied sera un long suivi d'un anceps (court ou long, pour ce problème vous n'aurez pas à déterminer lequel).

  • Une voyelle en latin peut être courte ou longue

  • Un «i» pris en sandwich entre deux voyelles (par exemple eiectum) est une consonne. (c'est-à-dire un "j")

  • Un «i» commençant un mot suivi d'une voyelle (par exemple Iactus) est également une consonne

  • Un "u" après un "q" est aussi une consonne (c'est-à-dire un "v")

  • Les diphtongues (ae, au, ei, eu, oe et ui) sont composées de deux voyelles mais comptent comme une voyelle et sont toujours longues

  • Une voyelle avec deux ou plusieurs consonnes entre elle et la voyelle suivante est toujours longue

  • Pour la règle précédente, un "l" ou un "r" après un "b", "c", "d", "g", "p" ou "t" ne compte pas comme une consonne

  • "x" compte pour deux consonnes

  • "ch", "ph", "th" et "qu" comptent comme une consonne

  • La syllabe "que" à la fin d'un mot (après élision) est toujours courte

  • Si une voyelle n'est pas forcée par l'une des règles précédentes, elle peut être longue ou courte, cela dépendra du compteur

Votre tâche sera de prendre une ligne de latin et d'en produire la scansion. Vous prendrez la ligne sous forme de chaîne via une entrée standard et sortirez une chaîne représentant la scansion finale.

L'entrée ne contiendra que des espaces et des caractères AZ.

Pour représenter la scansion, vous allez sortir toutes les syllabes en |délimitant la séparation des pieds. Une longue syllabe sera représentée par un -tandis qu'une courte syllabe sera marquée par un vet un anceps (la dernière syllabe de chaque ligne) sera marqué par un x. S'il existe plusieurs solutions, comme il en existe souvent, vous pouvez générer n'importe laquelle d'entre elles.

Cas de test

Le début de l'Énéide de Virgile.

 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

Autres stipulations

À la manière de la poésie latine, toutes les réponses doivent commencer par une invocation aux muses .

Le latin n'a que deux mots d'une lettre "e" et "a". Vous pouvez supposer qu'aucun autre mot d'une lettre n'apparaîtra en entrée.

Ad Hoc Garf Hunter
la source
2
Oh mon dieu ça ramène des souvenirs ...
ThreeFx
1
Un "i" procédant à une autre voyelle est une consonne (c'est-à-dire un "j"). Dans Lavinjaque ( --vv), c'est le cas, mais dans Italiam ( -vv-) dans le même verset, ce n'est pas le cas. Peut-être mettre Js en entrée? Avez-vous réellement une solution de travail générant cette sortie?
Lynn
Oh, l'avant-dernier pied est toujours un dactyle, classiquement. Vous devez spécifier si les réponses peuvent le supposer.
Lynn
@Lynn Puisque l'avant-dernier pied n'est pas toujours un dactyle, je l'ai laissé intentionnellement ambigu. Ce peut être l'un ou l'autre.
Ad Hoc Garf Hunter
@Dave 1) oui vous avez raison 2) Il faut terminer le mot entier. Je vais les corriger sous peu
Ad Hoc Garf Hunter

Réponses:

5

sed, 402 392 374 359 363 334 333 octets

"Chantez, déesse, la colère du fils de Pélée Achilleus et sa dévastation, qui a fait des milliers de douleurs aux Achians, ont jeté dans leurs multitudes à la maison de Hadès de fortes âmes de héros, mais ont donné à leurs corps pour être la délicate fête des chiens, de tous les oiseaux, et la volonté de Zeus a été accomplie depuis cette époque où il y avait d'abord dans la division du conflit le fils d'Atreus, le seigneur des hommes et le brillant Achilleus.

- Homère (L'Iliade); confus pourquoi cette citation est ici? vérifiez les règles.

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'

Pas exactement joué au golf, mais cela met en œuvre toutes les règles données sous la forme d'expressions régulières, qui se déroulent juste une par une pour atteindre la solution. Cela gère chaque ligne indépendamment, donc peut traiter une entrée multi-lignes entière.

Usage:

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

Panne:

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
"

Résultats pour les cas de 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
Dave
la source
Il convient de noter que j'obtiens des résultats différents pour les cas de test 2 et 3, qui semblent être des solutions alternatives non incluses dans la question. Il se peut que j'aie mal interprété une règle.
Dave
Je ne pense pas que votre scansion pour le cas de test 2 fonctionne. Le dernier "U" dans "PROFUGUS" doit être long car il y a deux consonnes ("S" et "L") avant la voyelle suivante. Dans votre scansion, vous êtes court. Je vérifie le troisième maintenant. Belle réponse quand même :)
Ad Hoc Garf Hunter
@WheatWizard ah ok, c'était une règle à laquelle je me posais des questions (j'aurais dû demander) - je l'ai pris pour signifier 2 consonnes sans espaces . Assez facile à réparer. Je publierai bientôt une mise à jour.
Dave
On dirait que j'avais aussi un bug vccvccvqui deviendrait -??au lieu de --?- corrigé maintenant. On dirait qu'il est d'accord avec vos échantillons sur tout sauf le cas # 2 maintenant.
Dave