Écrire un interprète pour 2B
J'aime le langage ésotérique 2B de David Catt , ayant la mémoire stockée dans une bande où chaque cellule est une bande d'octets séparée (la «sous-bande»). Écrivez-lui un interprète!
Spécification de langue
Les spécifications officielles peuvent être trouvées ici . Dans cette spécification, "
signifie un nombre dans la plage 0-9
( 0
est interprété comme 10
) et _
signifie une chaîne de n'importe quelle longueur. Chaque cellule stocke une valeur dans la plage 0-255
et le débordement / sous-débordement s'enroule comme s'il s'agissait d'un BF. (Merci @ MartinBüttner). Pour convertir du texte en nombres 0-255
, utilisez des codes ASCII . Parce que je ne trouve aucun détail à ce sujet, je vais dire que la longueur de la bande doit être 255
minimale, mais si vous savez le contraire, veuillez modifier.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction | Description |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0 | Zeroes the current cell and clears the overflow/underflow flag. |
| { | If the current cell is zero, jump to the matching }. |
| } | A placeholder for the { instruction. |
| ( | Read a byte from the input stream and place it in the current cell. |
| ) | Write the value of the current cell to the console. |
| x | Store the value of the current cell in a temporary register. |
| o | Write the value of the temporary register to the console. |
| ! | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ? | Performs a binary NOT on the current cell. |
| +" | Adds an amount to the current cell. |
| -" | Subtracts an amount from the current cell. |
| ^" | Moves the subtape up a number of times. |
| V" | Moves the subtape down a number of times. |
| <" | Moves the tape left a number of times. |
| >" | Moves the tape right a number of times. |
| :_: | Defines a label of name _. |
| *_* | Jumps to a label of name _. |
| ~_~ | Defines a function of name _. |
| @_@ | Calls a function of name _. |
| % | Ends a function definition. |
| #_# | Is a comment. |
| [SPACE] | Is an NOP. |
| [NEWLINE] | Is treated as whitespace and removed. |
| [TAB] | Is treated as whitespace and removed. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
Les tests
+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)
Devrait sortir Hello world!
+1:i:{()*i*}
Sorte de cat
programme, juste sans nouvelle ligne.
+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%
Devrait d'abord accepter un nom, puis, à la pression de Return, devrait sortir Hello name
(où le nom est ce qui a été entré).
Le mérite de ce programme revient à David Catt .
Je travaille sur un programme de test complet.
Règles
- Les failles standard sont interdites
- Votre interprète doit répondre à toutes les spécifications, à l'exception des commentaires, qui ne sont pas obligatoires.
Notation
- Il s'agit de code-golf , donc le moins d'octets gagne!
- -10 octets si votre interprète gère les commentaires.
Classement
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
la source
Réponses:
Python2,
748736731709704691 octetsC'était un petit défi amusant, je suis sûr que je peux rendre ce code encore plus court (peut-être que je le ferai plus tard).
Cette implémentation nécessite que les étiquettes et les fonctions soient déclarées (implémentées) avant d'être appelées. Il fonctionne parfaitement avec les deux tests donnés mais ne fonctionne malheureusement pas avec le programme "SayHi.2b" écrit par l'auteur du langage (même après avoir changé l'ordre de déclaration des fonctions). Je pense que ce problème pourrait être lié à la façon dont j'ai compris le système de bandes et de sous-bandes. Lorsque vous vous déplacez le long de la bande principale, la position de la sous-bande correspondante est-elle remise à 0? Pour le moment, je garde la position sur la sous-bande même lorsque je me déplace sur la bande principale.
Voici la version la plus lisible:
Edit: Tenez compte de la gestion des commentaires (-10 octets), corrigeant une erreur d'une erreur. Cette implémentation ne prend pas en charge les appels de fonction imbriqués (je pourrais l'implémenter si c'est une fonctionnalité requise)
Edit2: modification de la fonction de gestionnaire pour effectuer l'addition, la soustraction et le mouvement des cellules. Plus de lambdas! : D (la "version plus lisible" peut être désynchronisée maintenant)
Edit3: Je viens de réaliser que la gestion des commentaires me coûte 5 octets (en tenant compte du -10). Je viens donc de le retirer, c'est dommage qu'il semble maintenant incomplet.
Edit4: définition déplacée de n de lambda à var à l'intérieur du gestionnaire h ()
la source
+a+
, serait-il préférable de rejoindrea
? Cela vous débarrasserait également de devoir l'affecter à une var.SayHi.2b
fichier. Que se passe-t-il si elle est modifiée pour remettre la sous-bande à zéro lors d'un quart de travail?