Stackylogic es un lenguaje de programación basado en la lógica me hice a la que tienen en 0
's y 1
' s para la entrada y salida de una única 0
o 1
al finalizar.
Un programa Stackylogic consta de líneas que solo pueden contener los tres caracteres 01?
, así como exactamente uno <
al final de una de las líneas. Las líneas pueden no estar vacío y la línea con el <
deben tener al menos una 0
, 1
o ?
antes de ella.
Aquí hay un programa de muestra que (como explicaré) calcula la NAND de dos bits:
1
?<
11
?
0
Cada línea en un programa Stackylogic se considera una pila , con la parte inferior a la izquierda y la parte superior a la derecha. Implícitamente, hay una pila vacía (línea vacía) antes de la primera línea de un programa y después de la última línea.
El <
, que llamaremos el cursor , marca la pila para comenzar cuando se ejecuta un programa Stackylogic. La ejecución de un programa Stackylogic procede de la siguiente manera:
Saque el carácter superior de la pila a la que apunta actualmente el cursor.
- Si el personaje es
?
, solicite al usuario a0
o a1
y actúe como si ese fuera el personaje. - Si el personaje es
0
, mueva el cursor una pila hacia arriba (a la línea sobre la línea actual). - Si el personaje es
1
, mueva el cursor una pila hacia abajo (a la línea debajo de la línea actual).
- Si el personaje es
Si la pila a la que se mueve el cursor está vacía, muestre el último valor que se extrajo de una pila (siempre una
0
o1
) y finalice el programa.De lo contrario, si la pila a la que se mueve el cursor no está vacía, regrese al paso 1 y repita el proceso.
Tenga en cuenta que los programas de Stackylogic siempre terminan porque eventualmente deben agotar sus pilas.
Ejemplo NAND
En el programa NAND, el cursor comienza en ?
:
1
?<
11
?
0
Asumiremos que el usuario ingresa una 1
vez que ?
aparece, lo que significa que el cursor se moverá hacia abajo, haciendo que el programa se vea así:
1
11<
?
0
Ahora hay un plano 1
en la parte superior de la pila del cursor. Está debidamente reventado y el cursor se mueve de nuevo:
1
1
?<
0
Ahora suponga que el usuario ingresa 0
para el ?
, lo que significa que el cursor se moverá hacia arriba:
1
1<
0
Nuevamente, a 1
está en la pila del cursor, de modo que el cursor aparece y se mueve hacia abajo:
1
<
0
Finalmente, la pila del cursor está vacía, por lo que aparece el último valor 1
, se emite y finaliza el programa.
Esto es exacto para una compuerta NAND porque lo 1 NAND 0
es 1
. Por supuesto, esto funciona para las otras tres entradas de dos bits si desea verificar.
O ejemplo
Este programa Stackylogic simula una puerta OR :
?
?<
Es fácil ver que una entrada inicial de 1
empujará el cursor a la pila vacía implícita debajo de la última línea, finalizando el programa y generando el 1
que solo se ingresó.
Por 00
otro lado, para una entrada de , el cursor se abrirá camino hacia la pila vacía implícita en la parte superior, finalizando el programa y generando la última 0
entrada.
Desafío
Escriba un programa o función que tome un programa Stackylogic como una cadena y lo ejecute, imprimiendo o devolviendo el resultado 0
o 1
.
Luego de ?
's, puede solicitar al usuario una entrada 0
o 1
, o leer el valor de una cadena preestablecida de 0
' sy 1
'que también toma como entrada. (Esto podría ser otra entrada de cadena a su programa / función o simplemente podría asumir que la primera o última línea de la cadena de programa será la secuencia de entrada).
Puede suponer que el programa y la entrada siempre están bien formados. Opcionalmente, puede suponer que los programas de entrada vienen con una nueva línea final (aunque recuerde que siempre hay una pila vacía implícita al final).
El código más corto en bytes gana.
Más programas de muestra
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
1\???<\0
.
111\???????<\000
.
?\1?<\??
. Alternativamente, aquí hay una implementación simétrica de 5 líneas:?\?0\?<\?1\?