É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