Fannkuch est un programme de référence classique. Le nom vient de l'allemand "Pfannkuchen" - crêpes - pour la ressemblance de l'algorithme avec le retournement de piles de crêpes. Une séquence de nombres de Fannkuch est formée comme suit:
Prenez une permutation de {1 ..... n}, par exemple: {4,2,1,5,3}. Prenez le premier élément, ici 4, et inversez l'ordre des 4 premiers éléments: {5,1,2,4,3}. Répétez cette opération jusqu'à ce que le premier élément soit un 1, donc le retournement ne changera rien de plus: {3,4,2,1,5}, {2,4,3,1,5}, {4,2,3, 1,5}, {1,3,2,4,5}
Vous devez écrire un programme ou une fonction qui calcule une séquence de type Fannkuch pour les chaînes de caractères alphabétiques. Au lieu d'utiliser des nombres pour indiquer combien d'éléments de la liste doivent être inversés à chaque fois, la position d'une lettre dans l'alphabet doit être utilisée. Par exemple, un c
début indique que vous devez inverser l'ordre des 3 premiers éléments, tandis qu'un début a
indique que la séquence est terminée.
Contribution
L'entrée sera fournie sous forme de chaîne via stdin ou comme argument de fonction. La chaîne contiendra entre 1 et 26 lettres minuscules distinctes. Les chaînes ne contiendront pas de lettres dont l'index équivalent entraînerait l'algorithme de Fannkuch à retourner plus d'éléments qu'il n'en existe.
Production
Les programmes ou les fonctions doivent retourner ou imprimer pour afficher la séquence de termes produite en appliquant l'algorithme de Fannkuch jusqu'à ce qu'un interligne a
soit rencontré, y compris la chaîne initiale. Par exemple, si l'entrée est bca
, vous pouvez imprimer:
bca
cba
abc
Les résultats imprimés peuvent utiliser des séparateurs, virgules, sauts de ligne raisonnables, etc. Tout choix d'espaces est acceptable.
Comme autre exemple, si votre entrée est, eabdc
vous pouvez retourner:
("eabdc"
"cdbae"
"bdcae"
"dbcae"
"acbde")
Règles et notation
C'est le golf de code - le programme le plus court gagne. Les échappatoires standard ne sont pas autorisées.
la source
proc fcmp
ici.Haskell, 78 octets
Utilisation:
f "eabdc"
->["eabdc","cdbae","bdcae","dbcae","acbde"]
.la source
splitAt
- vous pouvez le réduire à 71 octets!K5, 21 octets
5 octets enregistrés grâce à @JohnE et un autre octet en réorganisant une expression.
Pour la première fois sur terre, je pense que K a battu CJam!
Version 27 octets
la source
a
, la chaîne ne changera pas.Haskell, 68
Toute tactique plus compliquée à laquelle je pensais prenait plus d'octets.
la source