Stackylogic è un linguaggio di programmazione basato sulla logica che ho inventato che accetta 0
"s 1
" e "s" per input e output un singolo 0
o 1
al completamento.
Un programma Stackylogic è composto da righe che possono contenere solo i tre caratteri 01?
e esattamente uno <
alla fine di una delle righe. Linee possono non essere vuoto e la riga con il <
devono avere almeno una 0
, 1
o ?
prima.
Ecco un programma di esempio che (come spiegherò) calcola la NAND di due bit:
1
?<
11
?
0
Ogni riga in un programma Stackylogic è considerata una pila , con il fondo a sinistra e quello in alto a destra. Implicitamente, c'è uno stack vuoto (riga vuota) prima della prima riga in un programma e dopo l'ultima riga.
Il <
, che chiameremo cursore , segna l'inizio dello stack quando viene eseguito un programma Stackylogic. L'esecuzione di un programma Stackylogic procede come segue:
Rimuovi il carattere superiore dallo stack a cui punta attualmente il cursore.
- Se il personaggio è
?
, chiedi all'utente a0
o a1
e agisci come se quello fosse il personaggio. - Se il personaggio è
0
, sposta il cursore di una pila verso l'alto (sulla riga sopra la riga corrente). - Se il personaggio è
1
, sposta il cursore di una pila verso il basso (sulla riga sotto la riga corrente).
- Se il personaggio è
Se lo stack su cui si sposta il cursore è vuoto, emette l'ultimo valore estratto da uno stack (sempre a
0
o1
) e termina il programma.Altrimenti, se lo stack su cui si sposta il cursore non è vuoto, tornare al passaggio 1 e ripetere il processo.
Si noti che i programmi Stackylogic finiscono sempre perché devono infine esaurire le loro pile.
Esempio NAND
Nel programma NAND il cursore inizia su un ?
:
1
?<
11
?
0
Supponiamo che l'utente inserisca una 1
volta che ?
viene visualizzato, il che significa che il cursore si sposterà verso il basso, facendo apparire il programma così:
1
11<
?
0
Ora una pianura si 1
trova nella parte superiore della pila di cursori. Viene opportunamente estratto e il cursore si sposta di nuovo:
1
1
?<
0
Ora supponiamo che gli input dell'utente 0
per il ?
, il che significa che il cursore si sposterà verso l'alto:
1
1<
0
Ancora una volta, a si 1
trova sulla pila del cursore, quindi il cursore si apre e si sposta verso il basso:
1
<
0
Alla fine lo stack del cursore è vuoto, quindi 1
viene emesso l'ultimo valore, il , viene emesso e il programma termina.
Questo è preciso per un gate NAND perché lo 1 NAND 0
è 1
. Questo ovviamente funziona per gli altri tre ingressi a due bit se si desidera verificare.
O Esempio
Questo programma Stackylogic simula un gate OR :
?
?<
È facile vedere che un input iniziale di 1
spingerà il cursore nello stack vuoto implicito sotto l'ultima riga, terminando il programma e producendo quello 1
che era appena input.
Per un input di, 00
d'altra parte, il cursore si dirige verso lo stack vuoto implicito in alto, terminando il programma e producendo l'ultimo 0
da inserire.
Sfida
Scrivi un programma o una funzione che accetta un programma Stackylogic come stringa e lo esegue, stampando o restituendo il risultante 0
o 1
.
Al ?
's, è possibile richiedere all'utente una 0
o 1
ingresso, o leggere il valore da una stringa di preset 0
' s e 1
's che si assumono come input. (Questo potrebbe essere un altro input di stringa per il tuo programma / funzione o potresti semplicemente supporre che la prima o l'ultima riga della stringa di programma sarà il flusso di input).
Si può presumere che il programma e l'input siano sempre ben formati. Si può facoltativamente supporre che i programmi di input vengano forniti con una nuova riga finale (sebbene si ricordi che alla fine c'è sempre uno stack vuoto implicito).
Vince il codice più breve in byte.
Altri programmi di esempio
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?<\??
. In alternativa, ecco un'implementazione simmetrica a 5 righe:?\?0\?<\?1\?