Escribe un intérprete para 2B
Me gusta el lenguaje esotérico 2B de David Catt , que tiene memoria almacenada en una cinta donde cada celda es una cinta separada de bytes (la 'subtapa'). ¡Escribe un intérprete para ello!
Especificación de idioma
La especificación oficial se puede encontrar aquí . En esta especificación, "
significa un número en el rango 0-9
( 0
se interpreta como 10
) y _
significa una cadena de cualquier longitud. Cada celda almacena un valor en el rango 0-255
, y el desbordamiento / subflujo se ajusta como si fuera un BF. (Gracias @ MartinBüttner). Para convertir texto a números 0-255
, use códigos ASCII . Como no puedo encontrar detalles sobre esto, voy a decir que la longitud de la cinta debe ser 255
mínima, pero si sabe lo contrario, edite.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 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. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
Pruebas
+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)
Debe salida Hello world!
+1:i:{()*i*}
Una especie de cat
programa, simplemente sin una nueva línea.
+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*}%
Primero debe aceptar un nombre, luego, al presionar Return, debe salir Hello name
(donde nombre es lo que se ingresó).
El crédito para ese programa va para David Catt .
Estoy trabajando en un programa de prueba completo.
Reglas
- Las lagunas estándar están prohibidas
- Su intérprete debe cumplir con todas las especificaciones, excepto los comentarios, que no son obligatorios.
Puntuación
- Este es el código de golf , ¡por lo que gana menos bytes!
- -10 bytes si su intérprete maneja los comentarios.
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes