Une sestina est un format de poème qui suit un modèle intéressant que nous pouvons générer. Il comporte six strophes de six lignes chacune, où les derniers mots de chaque ligne de la première strophe constituent les terminaisons de ligne de chaque strophe successive, tournés selon un modèle défini. (Il y a aussi une strophe de trois lignes à la fin, mais nous ne nous en inquiéterons pas.) Jetez un coup d'œil aux trois premières strophes d'Elizabeth Bishop, créatives, nommées Sestina :
La pluie de septembre tombe sur la maison.
Dans la lumière défaillante, la vieille grand-mère est
assise dans la cuisine avec l'enfant à
côté du Little Marvel Stove,
lisant les blagues de l'almanach,
riant et parlant pour cacher ses larmes.Elle pense que ses larmes équinoxiales
et la pluie qui bat sur le toit de la maison
ont été annoncées par l'almanach,
mais seulement connues d'une grand-mère.
La bouilloire en fer chante sur la cuisinière.
Elle coupe du pain et dit à l'enfant:Il est temps pour le thé maintenant; mais l'enfant
regarde les petites larmes dures de la bouilloire
danser comme un fou sur le poêle noir et chaud,
comme la pluie doit danser sur la maison.
Rangement, la vieille grand-mère
raccroche l'almanach intelligent...
Notez comment chaque ligne se termine par l'un des six mots «maison», «grand-mère», «enfant», «poêle», «almanach» ou «larmes». Non seulement cela, mais les mots sont ordonnés dans le motif 6–1—5–2—4–3, par rapport à la strophe précédente. Cela finit par ressembler à une spirale:
Il nous reste encore quelques années avant de générer par programme une sestina complète, mais nous pouvons créer un modèle contenant les derniers mots de chaque strophe dans le bon ordre. Écrivez un programme ou une fonction qui, compte tenu des six mots de fin de ligne, génère le plan pour une sestina, en suivant ces règles. Voici le résultat attendu pour l'entrée house grandmother child stove almanac tears
:
house
grandmother
child
stove
almanac
tears
tears
house
almanac
grandmother
stove
child
child
tears
stove
house
grandmother
almanac
almanac
child
grandmother
tears
house
stove
stove
almanac
house
child
tears
grandmother
grandmother
stove
tears
almanac
child
house
La première strophe est constituée des mots dans l'ordre d'origine, la deuxième strophe est dans l'ordre 6-1-5-2-4-3 du premier. La troisième strophe est cet ordre par rapport à la seconde, et ainsi de suite, jusqu'à la strophe 6.
Supposons que les mots saisis seront toujours uniquement des lettres, majuscules ou minuscules. Vous pouvez les prendre comme un tableau de chaînes ou une chaîne unique délimitée par un caractère non-lettre (espace, nouvelle ligne, etc.). Dans la sortie, les lignes sont séparées par des sauts de ligne ( 0x0A
) et les strophes sont séparées par deux sauts de ligne. Une nouvelle ligne de fin est acceptable.
C'est le code-golf , donc le code le plus court en octets gagne. Cela étant dit, il peut être plus court de compresser toute la structure du poème, mais j'aimerais voir des solutions qui basent chaque strophe sur la précédente.
natural-language
tag. L'algorithme est le même même si l'entrée est de six chaînes de charabia.Réponses:
Gelée ,
1514 octetsTryItOnline!
Comment?
Oui, une utilisation de l'un de mes ajouts à Jelly! (
œ?
)la source
Python,
7264 octetsPrend l'entrée via STDIN en tant que tableau séparé par des virgules de 6 chaînes et les sorties vers STDOUT dans le format décrit dans la publication avec un retour à la ligne supplémentaire.
Essayez-le en ligne! (Ideone)
De plus, je ne suis pas sûr que ce soit correct, mais voici une réponse plus courte sous la forme d'une fonction lambda anonyme à 59 octets qui accepte les entrées dans le même format que la réponse ci-dessus et génère le programme nécessaire pour générer la sortie correcte:
Par conséquent, il doit être appelé dans le format
exec(<Function Name>(<Array>))
. Encore une fois, je ne suis pas sûr que ce soit correct, alors j'ajoute cela comme une réponse supplémentaire, distincte et non concurrente jusqu'à ce que quelqu'un (peut-être même OP) puisse, je l'espère, clarifier si cela va ou non, ce que j'apprécierais vraiment .la source
pop
truc!MATL ,
1817 octetsL'entrée est un tableau de cellules de chaînes, au format
Essayez-le en ligne!
Explication
la source
Mathematica, 59 octets
Le noyau de cette fonction sans nom est
NestList[RotateRight,#,5]
, qui prend une liste d'entrée de longueur 6 et crée une liste de 6 listes, chacune tournée dans le sens sestina. En effet, si une liste de listes de chaînes est une sortie acceptable, alorsNestList[RotateRight,#,5]&
le travail se fait en 26 octets .Ensuite,
r[...,""]
insère une chaîne vide entre chacune des 6 listes;Flatten
transforme le tout en une seule liste de chaînes;~r~"\n"
insère ensuite une nouvelle ligne entre chacune de ces chaînes; et""<>
concatène le tout en une seule chaîne. Ainsi, les 33 autres octets ne servent qu'à convertir la sortie structurée en une seule chaîne.la source
Lot, 99 octets
Explication: prend l'entrée en tant que paramètres de ligne de commande. Le
%0
fait tourner en boucle, accumulant.
s dans le 7e paramètre initialement vide. L'extra.
est parceif
que ne fonctionne pas sur les chaînes vides.la source
Rubis, 51 octets
Au lieu d'itérer sur les nombres
0..5
comme ci-dessous, nous répétons 6 fois en itérant sur les éléments dez
. Dans une utilisation normale telle que(0..5).map{|i|puts i}
le code{}
lit les éléments itérés. Dans ce cas, les permutations effectuées par le code à l'intérieur du{}
ne lisent pas les éléments itérés, nous pouvons donc parcourir les éléments dez
sans que cela interfère avec les permutations.Rubis, 56 octets
Prend un tableau de 6 éléments comme paramètre
version alternative prenant 6 paramètres
A chaque itération de
map
nous permutonsz
. La version originale plus un""
pour représenter une rupture entre les strophes devient la sortie dumap
(ce septième élément de tableau n'est pas nécessaire par l'affectation, il est donc ignoré).*$/
convertit les tableaux en chaîne, joignant le tout avec des retours à la ligne.la source
Raquette 115 octets
Non golfé:
Essai:
Production:
la source