Ce défi a été publié dans le cadre du défi LotM d'avril 2018
Brain-Flak est un langage turing-tarpit qui a acquis beaucoup de renommée ici sur PPCG. La mémoire de la langue est composée de deux piles, mais un « caché » troisième pile a été découverte par Wh e à Wizard , conduisant à de nouvelles façons intéressantes de penser les programmes Brain-Flak.
Alors, qu'en est-il de donner plus de visibilité à cette pauvre troisième pile cachée? Créons un langage où la troisième pile a la reconnaissance qu'elle mérite! Ici, je vous présente Third-Flak .
La langue
Dans Third-Flak, il n'y a qu'une seule pile, appelée la troisième pile. Les opérateurs travaillent sur la troisième pile de la même façon que dans Brain-Flak, mais ici il n'y a pas []
, {}
, <>
nilads et pas {...}
monade ( de sorte que les caractères ne sont recevables que dans un programme de troisième Flak sont ()[]<>
). Voici ce que fait chaque opérateur (des exemples seront donnés représentant la troisième pile avec une liste où le dernier élément est le haut de la pile):
()
est le seul opérateur à deux caractères de Third-Flak. Il augmente le haut de la troisième pile de 1. Exemple:[1,2,3]
→[1,2,4]
(
,[
,<
: Toutes les parenthèses d'ouverture qui ne sont pas couverts par le cas précédent pousser un0
à la troisième pile. Exemple:[1,2,3]
→[1,2,3,0]
)
sort deux éléments de la troisième pile et repousse leur somme. Exemple:[1,2,3]
→[1,5]
]
sort deux éléments de la troisième pile et repousse le résultat de la soustraction du premier de la seconde. Exemple:[1,2,3]
→[1,-1]
>
sort un élément de la troisième pile. Exemple[1,2,3]
→[1,2]
Et voici les autres règles de la langue:
Au début de l'exécution, la troisième pile ne contient qu'un seul 0.
Il est interdit d'avoir vide
[]
ou à l'<>
intérieur d'un programme (ils seraient de toute façon noops s'ils suivaient la sémantique de Third-Flak, mais ils ont en fait une signification différente dans Brain-Flak qu'il n'est pas possible de recréer ici).Les parenthèses doivent toujours être équilibrées, à l'exception du fait que les parenthèses fermantes de fin à la fin du programme peuvent être manquantes. Par exemple,
[()<(()
est un programme Third-Flak valide (et la troisième pile à la fin du programme serait[1,0,1]
).Un programme ne peut contenir que les six caractères autorisés
()[]<>
. Les programmes sont garantis non vides.
Remarque: il est sous-entendu par les règles précédentes que vous n'aurez pas à faire face à des situations où vous devez sauter d'une pile vide.
Le défi
Simple, écrivez un interprète pour Third-Flak. Votre programme doit prendre en entrée un programme Third-Flak et retourner en sortie l'état de la troisième pile à la fin du programme.
Votre format de sortie est flexible tant qu'il est possible de lire sans ambiguïté l'état de la troisième pile et le même nombre est toujours codé de la même manière (c'est juste une façon de dire que tout format de sortie qui n'est pas flagrant) essayer de tricher est très bien).
Votre choix de sortie peut restreindre la plage de nombres que vous pouvez gérer tant que cela ne banalise pas le défi (car ce serait une faille par défaut ).
Cas de test
Pour chaque scénario de test, la première ligne est l'entrée et la deuxième ligne la pile de sortie représentée sous la forme d'une liste de nombres séparés par des espaces où le haut de la pile est le dernier élément.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
[()]
enfreint la règle selon laquelle nous n'avons pas à nous soucier de sauter d'une pile videe
est ici .Réponses:
Brain-Flak , 276 octets
Essayez-le en ligne!
Vous deviez savoir que cela allait arriver.
la source
Retina 0.8.2 ,
644846 octetsEssayez-le en ligne! Sort la pile de bas en haut. Fonctionne uniquement avec des entiers non négatifs, et le dernier scénario de test est trop lent, donc le lien ne comprend que trois scénarios de test. Explication: la pile précède implicitement le programme, elle commence donc comme la chaîne vide, qui représente un seul zéro. Le
()
nilad est transformé en un_
qui est utilisé pour compter en unaire, tandis que les autres supports ouverts sont transformés en sauts de ligne qui poussent un zéro sur la pile au fur et à mesure qu'ils sont rencontrés. Les parenthèses fermées sont ensuite traitées une à la fois afin que la pile soit correcte; le)
supprime la nouvelle ligne précédente, en ajoutant les deux premiers éléments ensemble, le]
supprime l'élément supérieur et le fait correspondre à l'élément précédent sur la pile, le soustrayant ainsi, et le>
supprime simplement l'élément supérieur. Enfin, la pile est convertie en décimal. Edit: sauvé 2 octets grâce à @Leo.la source
$3
sert? (bonne réponse quand même!)Python 3 ,
145 144 132 132 122 116 109104 104 octets-7 octets grâce à Leo!
Et - 5 merci à Lynn!
Essayez-le en ligne!
Implémentation assez standard.Pas si lisible maintenant cependant. Je suis déçu de ne pas avoir pu trouver un moyen plus court de vérifier entre les crochets de début et de fin.Quelques tentatives de one-liners:
124 octets (fonction anonyme):
115 octets (programme complet):
L'ajout est énormément plus long que la simple affectation
la source
~-']>)'.index(i)
peut être(2-ord(i)%5)
d'économiser 4 octets.Rubis ,
9891 octetsEssayez-le en ligne!
Mon code initial fonctionnait de manière similaire dans l'esprit à la réponse Python de Jo King, de sorte qu'avant de parcourir les caractères source, nous avons remplacé toutes les
()
sous-chaînes par un autre caractère, en tant qu'opérateur distinct.Cependant, au moins dans Ruby, il s'est avéré que le golfeur ne faisait pas cela, mais optait plutôt pour une approche légèrement plus lourde. Ici, nous maintenons un indexeur supplémentaire en
i
gardant une trace de notre position dans la chaîne source, et chaque fois qu'un crochet d'ouverture est rencontré, nous vérifions en amont si nos caractères actuels + suivantss[i,2]
forment l'()
opérateur. Dans ce cas, nous poussons 1 au lieu de 0 en haut de la pile et laissons la fermeture)
faire son travail à l'étape suivante.la source
05AB1E , 25 octets
Essayez-le en ligne!
Explication
la source
SOGL V0.12 , 34 octets
Essayez-le ici!
la source
R ,
182177 octetsEssayez-le en ligne!
Renvoie la pile, où le haut de la pile est le premier et le bas de la pile est le dernier.
Échange
()
avec7
puis calcule les points de code mod 8 pour obtenir des valeurs numériques distinctes, qui sont plus faciles et plus faciles à utiliser que les chaînes.C'est golfier de travailler avec le début d'un vecteur dans R, donc nous construisons la pile de cette façon.
Ensuite, il voit un
)
, ou quandk==1
, il ajoute un zéro supplémentaire en haut de la pile car il est golfeur de l'ajouter et de le supprimer.la source
CJam , 29 octets
Essayez-le en ligne!
la source
Ceylan,
285266 octetsEssayez-le en ligne!
(Enregistré 19 octets en raison d'une suggestion de Leo.)
Formaté et commenté:
Essayez-le en ligne!
la source