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
fuente
Respuestas:
Python2,
748736731709704691 bytesEste fue un pequeño desafío divertido, estoy seguro de que puedo hacer que este código sea aún más corto (tal vez lo haga en algún momento más adelante).
Esta implementación requiere que las etiquetas y funciones sean declaradas (implementadas) antes de ser llamadas. Funciona perfectamente con las dos pruebas dadas, pero desafortunadamente no funciona con el programa "SayHi.2b" escrito por el autor del lenguaje (incluso después de cambiar el orden de declaración de las funciones). Creo que este problema podría tener que ver con la forma en que entendí el sistema de cintas y subcapas. Cuando se mueve a lo largo de la cinta principal, ¿la posición en la subtapa correspondiente se restablece a 0? En este momento mantengo la posición en la subtape incluso cuando me muevo en la cinta principal.
Aquí está la versión más legible:
Editar: tenga en cuenta el manejo de comentarios (-10 bytes), arreglando un error por un error. Esta implementación no admite llamadas de función anidadas (podría implementarla si es una característica requerida)
Edit2: Cambió la función del controlador para hacer sumas, restas y movimientos de celdas. ¡Más lambdas! : D (La "versión más legible" puede no estar sincronizada ahora)
Edit3: acabo de darme cuenta de que manejar comentarios me cuesta 5 bytes (teniendo en cuenta el -10). Así que lo acabo de quitar, es una pena que ahora se sienta incompleto.
Edit4: movió la definición de n de lambda a var dentro del controlador h ()
fuente
+a+
podría ser mejor unirsea
? También se libraría de tener que asignarlo a una var.SayHi.2b
archivo funcione. ¿Qué sucede si se cambia para restablecer la subtapa a cero en un turno?