Stackylogic é uma linguagem de programação baseada em lógica que inventei 0
's 1
' e 's para entrada e saída de um único 0
ou 1
após a conclusão.
Um programa Stackylogic consiste em linhas que podem conter apenas os três caracteres 01?
, bem como exatamente um <
no final de uma das linhas. As linhas podem não estar vazio e a linha com o <
deve ter pelo menos um 0
, 1
ou ?
antes dela.
Aqui está um exemplo de programa que (como explicarei) calcula a NAND de dois bits:
1
?<
11
?
0
Cada linha em um programa Stackylogic é considerada uma pilha , com a parte inferior à esquerda e a parte superior à direita. Implicitamente, há uma pilha vazia (linha vazia) antes da primeira linha de um programa e depois da última linha.
O <
, que chamaremos de cursor , marca a pilha para iniciar quando um programa Stackylogic é executado. A execução de um programa Stackylogic ocorre da seguinte maneira:
Retire o caractere superior da pilha para a qual o cursor está apontando.
- Se o personagem for
?
, solicite a0
ou a um usuário1
e aja como se fosse o personagem. - Se o caractere for
0
, mova o cursor uma pilha para cima (para a linha acima da linha atual). - Se o caractere for
1
, mova o cursor uma pilha para baixo (para a linha abaixo da linha atual).
- Se o personagem for
Se a pilha para a qual o cursor se move estiver vazia, imprima o último valor que foi retirado de uma pilha (sempre a
0
ou1
) e encerre o programa.Caso contrário, se a pilha para a qual o cursor se move não estiver vazia, volte para a etapa 1 e repita o processo.
Observe que os programas Stackylogic sempre terminam porque eles acabam esgotando suas pilhas.
Exemplo NAND
No programa NAND, o cursor inicia em ?
:
1
?<
11
?
0
Assumiremos que o usuário digita uma 1
vez que ?
é acionado, o que significa que o cursor se moverá para baixo, fazendo com que o programa fique assim:
1
11<
?
0
Agora, uma planície 1
está no topo da pilha do cursor. É devidamente acionado e o cursor se move novamente:
1
1
?<
0
Agora assuma as entradas do usuário 0
para o ?
, o que significa que o cursor se moverá para cima:
1
1<
0
Novamente, a 1
está na pilha de cursores, então o cursor aparece e se move para baixo:
1
<
0
Finalmente, a pilha do cursor está vazia; portanto, o último valor exibido, o 1
, é gerado e o programa termina.
Isso é preciso para uma porta NAND porque 1 NAND 0
é 1
. Obviamente, isso funciona para as outras três entradas de dois bits, se você quiser verificar.
Exemplo OR
Este programa Stackylogic simula uma porta OR :
?
?<
É fácil ver que uma entrada inicial de 1
empurrará o cursor para a pilha vazia implícita abaixo da última linha, encerrando o programa e emitindo a 1
que acabou de ser inserida.
Por 00
outro lado, para uma entrada de , o cursor seguirá para a pilha vazia implícita na parte superior, encerrando o programa e emitindo a última 0
a ser inserida.
Desafio
Escreva um programa ou função que pegue um programa Stackylogic como uma string e execute-o, imprimindo ou retornando o 0
ou resultante 1
.
Após a ?
's, você pode solicitar que o usuário para uma 0
ou 1
entrada, ou ler o valor de uma string pré-estabelecido de 0
' s e 1
's que você também tomar como entrada. (Essa pode ser outra entrada de string para seu programa / função ou você pode simplesmente assumir que a primeira ou a última linha da string de programa será o fluxo de entrada).
Você pode assumir que o programa e a entrada estão sempre bem formados. Opcionalmente, você pode assumir que os programas de entrada vêm com uma única nova linha à direita (embora lembre-se de que sempre há uma pilha vazia implícita no final).
O código mais curto em bytes vence.
Mais programas de amostra
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?<\??
. Como alternativa, aqui está uma implementação simétrica de 5 linhas:?\?0\?<\?1\?