Pyramid Scheme est un langage développé par @ ConorO'Brien . Dans Pyramid Scheme, le code que vous écrivez ressemble à ceci:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Maintenant, ce code a deux qualités évidentes: il est difficile à analyser et difficile à écrire. Conor a résolu le premier, mais ce sera votre travail de résoudre ce deuxième problème.
Le code ci-dessus est traité par l'interpréteur PyramidScheme dans un tableau de chaînes imbriqué, comme ceci:
[["+", ["9123", "3"]], "3"]
Votre tâche consiste à écrire un programme ou une fonction qui, à partir d'un tableau imbriqué de chaînes, génère ou renvoie le code PyramidScheme recréé. Vous pouvez supposer que le tableau d'entrée sera toujours valide.
Une pyramide est un triangle isocèle. Le haut est ^
, les côtés sont inclinés en diagonale avec /
et \
, et le bas est -
. Les deux coins inférieurs sont vides ou contiennent le début d'autres pyramides, qui sont des arguments. Le milieu est rempli du nom de la pyramide, ignorant les sauts de ligne.
Voici comment l'analyseur convertit le code dans un format utilisable. Tout d'abord, il recherche une pyramide de niveau supérieur. S'il ne prend aucun argument, il le représente avec une seule chaîne et passe à autre chose. Sinon, il représente un tableau ["name",[arg1,arg2]]
ou ["name",[arg1]]
. Les arguments sont les pyramides en bas à gauche et en bas à droite de la pyramide, qui peuvent être soit des chaînes, soit plusieurs tableaux décrits comme ci-dessus. Vous remarquerez peut-être que cela ressemble un peu à Lisp, auquel cas vous avez peut-être également remarqué le jeu de mots terrible qu'est le nom de la langue. Une fois la pyramide entièrement représentée, l'analyseur passe à la suivante.
C'est le code-golf , le code le plus court gagne!
Cas de test: ce ne sont pas les seules sorties valides, ce sont des exemples de sorties valides.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
Remarquez que dans le deuxième cas de test, la deuxième et la troisième out
pyramide ont toutes deux ["chr", ["108"]]
un paramètre, qui est réduit en une pile de pyramides partagée par deux de niveau supérieur. Il s'agit d'une optimisation valide que votre code peut prendre en charge, mais elle est complètement facultative; la notation n'est pas basée sur la longueur de votre sortie.
Pour les curieux, le premier cas s'affiche en 9126 3
raison de l'impression implicite de pyramides de haut niveau, le second s'imprime Hello
et le dernier est une erreur de syntaxe, incluse simplement parce qu'elle a une structure soignée.
Vous pouvez supposer que l'entrée ne contient que des caractères ASCII imprimables, à l' exclusion des espaces, ^
, /
, \
et -
. L'entrée sera toujours valide et contiendra au moins une pyramide. Il n'y a pas de limite sur la taille du tableau ou des chaînes d'entrée, mais vous pouvez écrire votre code comme si le type d'entier par défaut de votre langue était d'une précision infinie et que votre ordinateur avait une mémoire arbitraire. Si vous prenez l'entrée comme une seule chaîne, vous pouvez utiliser n'importe quoi de raisonnable (virgule, espace, etc. tant qu'il est en ascii imprimable et non "
ou []
) pour délimiter les tableaux. Vous n'avez pas besoin d'inclure des crochets entourant le tout, et prenez plutôt plusieurs tableaux séparés par votre délimiteur.
Votre sortie n'a pas besoin d'être jouée au golf, vous pouvez insérer de l'espace supplémentaire ou agrandir vos pyramides. Les pyramides de Toplevel devraient être sur la première ligne. La sortie doit être une chaîne avec des retours à la ligne ou une liste de chaînes.
Toute personne qui ne comprend une version de leur code qui de manière optimale les pyramides joue au golf peut recevoir une certaine représentant sous forme de upvotes / primes (mais probablement upvotes).
Réponses:
Lisp commun -
25241890 octetsMerci à @coredump pour un certain nombre d'astuces de golf. Exemple de sortie de la question:
Voici la version originale, (principalement) non golfée:
Essayez-le en ligne!
la source
()
; vous pouvez également utiliser des variables de lecteur, parfoisloop while (not x)
estloop until x
,(cdr (cdr x))
est(cddr x)
,(setf a b c d)
est plus court que(setf a b)
suivi(setf c d)
, etc. Mais c'est déjà une bonne réponse