Pyth est peut-être le langage de golf polyvalent le plus réussi. Bien qu'il soit quelque peu en déclin en raison des nouveaux langages, de 2014 à 2016, la syntaxe concise de Pyth, les mises à jour constantes, la surcharge et (pour son époque) de nombreux modules intégrés en ont fait un favori pour la majorité des questions.
Le code Pyth est souvent difficile à lire. Même la sortie du mode de débogage (Python transpilé) consiste souvent en une longue ligne, parfois avec des parenthèses imbriquées à dix profondeurs. Cependant, Pyth correctement formaté est très lisible.
Voici un morceau de code Pyth, écrit par @isaacg dans Play the Word Chain .
.MlZfqhMtTeMPT+Lzs.pMyQ
C'est beaucoup plus lisible comme ça.
.M Filter by gives-maximal-value of
l Z lambda Z:length(Z) over
f filter by (lambda T:
q equal
hM t T head-map tail T
eM P T end-map Pop T)
+L Append z to each element in
z
s .pM y Q flattened permutations of each subset of Q
Pour ce défi, nous éliminons l' aspect de complexité kolmogorov de la catégorisation des caractères Pyth et nous nous concentrons sur le formatage. Au lieu d'être du code Pyth, l'entrée sera composée de caractères 0123456789M
. Le chiffre n
représente une fonction de l'aritén
et M
représente un opérateur. Par exemple, le code ci-dessus est représenté par 210221M101M102M011M10
. Voici les étapes pour minimiser:
Séparez la chaîne en jetons.
Un jeton correspond [0-9]M*
.0M
ne se produira pas en entrée.
Ajoutez des 0 de fin.
Lorsqu'il n'y a pas assez d'arguments, Pyth ajoute autant de variables implicites (variables lambda ou Q
s) au code que nécessaire pour remplir les arguments du programme; ceux-ci devraient être représentés par l' 0
art.
Regroupez les jetons en lignes.
L'arité d'un jeton est la valeur de son chiffre.
Un jeton arity-0 (c'est-à-dire un 0) termine une ligne.
Pour un jeton arity-1, le jeton suivant doit aller sur la même ligne, séparé par un espace.
Pour un jeton arity> = 2, ses arguments vont sur des lignes distinctes, dans l'ordre où ils apparaissent dans le code, chacun suivi de ses propres sous-arguments, etc. Les arguments d'un jeton sont mis en retrait à la fin de ce jeton plus un espace.
Contribution
Une chaîne non vide (ou un tableau de caractères, un tableau de chaînes de longueur 1, etc., comme le permettent les méthodes d'E / S standard) 0123456789M
, qui ne contiendra pas la sous-chaîne0M
.
Production
La chaîne formatée selon les règles ci-dessus.
Cas de test
210221M101M102M011M10
2
1 0
2
2
1M 1 0
1M 1 0
2M
0
1 1M 1 0
123M4M
1 2
3M
4M
0
0
0
0
0
0
0
2MM
2MM
0
0
11011100
1 1 0
1 1 1 0
0
9000000
9
0
0
0
0
0
0
0
0
0
210221M101M102M011M10
serait[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
s pouvaient être un type de données différent des entiers.M
?Réponses:
JavaScript (ES8),
160159 octetsEssayez-le en ligne!
Commenté
la source
Haskell ,
192190187 octetsEssayez-le en ligne!
Il doit y avoir un meilleur moyen de gérer le cas arity-1, il prend actuellement 45 octets.
Modifications:
pred
au lieu den-1
.Essayez-le en ligne!
la source
Fusain , 75 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Parcourez les caractères saisis et transformez-les en une liste de chiffres avec des
M
suffixes facultatifs .Inversez cette liste afin que nous puissions l'utiliser
Pop
pour la consommer.Cette variable est une pile de jetons dont l'arité n'est pas encore remplie.
Cette variable est une pile de l'arité restante des jetons non remplis.
Répétez jusqu'à ce que nous ayons consommé tous les jetons et vidé la pile.
Obtenez le prochain jeton ou
0
sinon.Imprimez le jeton, puis déplacez le curseur horizontalement s'il commence par une
1
autre diagonale.Ajoutez le jeton et son arité aux variables appropriées.
Répétez l'opération pendant que la pile d'arités n'est pas vide mais l'arité supérieure est nulle.
Jeter l'arité zéro.
Retirez son jeton et déplacez autant de personnages qu'il reste.
S'il reste des arités, décrémentez l'arité supérieure.
la source