En este desafío, escribirás un intérprete para 2 Ω (transcrito como TwoMega ), un lenguaje basado libremente en el cerebro con un espacio de almacenamiento de dimensiones infinitas.
El idioma
2 Ω contiene tres partes de estado:
La cinta , que es una lista infinita de bits, todos inicializados a 0. Tiene un elemento situado más a la izquierda, pero ningún elemento situado a la derecha.
El puntero de memoria , que es un entero no negativo que es un índice de un elemento en la cinta. Un puntero de memoria más alto se refiere a una celda de cinta más a la derecha; un puntero de memoria de 0 se refiere al elemento más a la izquierda. El puntero de memoria se inicializa a 0.
El Hypercube , que es una "caja" de celdas conceptualmente ∞ -dimensional, cada una de las cuales contiene un bit inicializado a 0. El ancho del Hypercube está limitado en cada dimensión a solo 2 celdas, pero el infinito de dimensiones significa el número de Las células son incontables .
Un índice en el hipercubo es una lista infinita de bits que se refiere a una celda en el hipercubo (de la misma manera que una lista finita de bits podría usarse para referirse a un hipercubo de dimensión finita). Debido a que la cinta es una lista infinita de bits, toda la cinta siempre se refiere a un elemento del hipercubo; Este elemento se llama el referente .
2 Ω da significado a 7 caracteres diferentes:
<
disminuye el puntero de memoria en 1. Disminuirlo por debajo de 0 es un comportamiento indefinido, por lo que no necesita manejarlo.>
incrementa el puntero de memoria en 1.!
le da la vuelta al referente..
saca el bit en el referente.^
reemplaza el bit en la celda señalada por el puntero de memoria en la cinta con el inverso del bit en el referente.[x]
ejecuta el códigox
siempre que el bit en el referente sea 1.
El reto
Su tarea es escribir un programa que tome una cadena como entrada y la ejecute como un programa de 2 Ω .
Este es el código de golf , por lo que gana la respuesta válida más corta (medida en bytes).
Notas
- Puede suponer que el programa consistirá únicamente en los personajes
<>!.^[]
y que[]
estará anidado correctamente. - Su intérprete solo debe estar limitado por la memoria disponible en el sistema. Debería poder ejecutar los programas de muestra en un período de tiempo razonable.
Programas de muestra
Imprimir 1:
!.
Imprimir 010:
.!.!.
Imprimir 0 para siempre:
![!.!]
Imprima 0 para siempre o 1 para siempre si !
se antepone:
[.]![!.!]
cat
programa: no parece haber una instrucción para recibir aportes.
.
imprime un solo cero y luego existe; !^!.
- imprime uno y luego sale. Sin embargo, más sería bueno. Por el momento, uno debe comprender los envíos para verificarlos (¡y por lo tanto votarlos!)
[0,0,0,0,0,0,0...]
(es decir, la presencia de un !
al inicio del programa).
[.]![!.!]
para imprimir el valor de esa celda para siempre
1
s en la cinta siempre es finito. De hecho, existe una biyección bastante simple entre los números naturales y los estados de la cinta (interpretar el contenido de la cinta como un número binario hacia atrás), lo que muestra que el Hypercube es básicamente una matriz 1D infinita, a la que se accede volteando bits en un valor de puntero entero , en lugar de disminuir / disminuir como en brainfuck.