Stackylogic è un linguaggio di programmazione che ho inventato in una precedente sfida: eseguire Stackylogic . Leggi quel post per tutti i dettagli e gli esempi, ma ecco come funziona parafrasato:
Stackylogic prende
0
's e1
' s per l'input ed emette un singolo0
o1
al completamento.Un programma è composto da righe che contengono solo i caratteri
01?
, nonché esattamente uno<
alla fine di una delle righe. Linee possono non essere vuoto e la riga con il<
devono avere almeno una0
,1
o?
prima.Ecco un programma di esempio che calcola la NAND di due bit:
1 ?< 11 ? 0
Ogni riga di un programma è considerata una pila , con il fondo a sinistra e quello in alto a destra. Implicitamente, c'è uno stack vuoto (cioè una riga vuota) prima della prima riga di un programma e dopo l'ultima riga.
Il
<
, chiamato il cursore, segna lo stack per iniziare quando viene eseguito un programma. L'esecuzione 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 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.
La cosa chiave da realizzare per questa sfida è che tutti i programmi Stackylogic equivalgono a una tabella di verità . Viene immesso un numero predeterminato di valori booleani e viene determinato in modo deterministico esattamente un valore booleano.
Quindi il tuo compito è quello di produrre un programma Stackylogic che soddisfi o simuli, cioè abbia lo stesso output di qualsiasi data tabella di verità. Ma non è ovvio che Stackylogic può simulare qualsiasi tabella di verità, quindi ecco una prova per induzione :
Caso base
Le due tabelle di verità 0 input sono le tabelle che producono sempre
0
o1
. Gli equivalenti Stackylogic di queste tabelle sono0<
e1<
rispettivamente.Passo induttivo
Supponiamo che Stackylogic possa simulare qualsiasi tabella di verità N-input. Sia M = N + 1.
Una tabella di input M, T, può essere espressa come due tabelle di input N, T 0 e T 1 , più il bit di input aggiuntivo B. Quando B è 0, viene utilizzato il risultato di T 0 . Quando B è 1, viene utilizzato il risultato di T 1 .
Ad esempio, la tabella di verità a 3 input corrispondente allo pseudocodice
if B: result = x OR y else: result = x NAND y
è
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
che sono in realtà le due tabelle di verità a 2 input per NAND e OR sovrapposte l'una all'altra con il bit di muxing B.
Siano S 0 e S 1 i programmi Stackylogic che soddisfano rispettivamente T 0 e T 1 (sappiamo che esistono sulla base del primo presupposto). Il programma S che soddisfa T può quindi essere costruito come:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
Questa disposizione si combina efficacemente tra S 0 e S 1 in base al primo bit di ingresso (dalla linea
?<
). In tal caso0
, il cursore si sposta su quello aggiunto0
fino alla posizione originale del cursore di S 0 , che sarà quindi delimitato in alto e in basso da pile vuote, e quindi verrà eseguito esattamente identico allo S 0 originale . Allo stesso modo, se1
viene inserito, il cursore si sposterà1
verso il basso fino alla posizione del cursore di S 1 e procederà ad eseguirlo come se fosse solo.Ad esempio, i programmi Stackylogic per OR e NAND sono
? ?<
e
1 ?< 11 ? 0
Possono essere combinati per simulare
if B: result = x OR y else: result = x NAND y
così:
1 ? 110 ?0 00 0 ?< ?1 ?
Pertanto, qualsiasi tabella di verità può essere simulata da un programma Stackylogic.
Sfida
Scrivi un programma o una funzione che accetta una tabella di verità di input N (N> 0) sotto forma di un elenco di 2 valori booleani N che rappresentano gli output della tabella in ordine binario crescente.
Qualsiasi formato di input ragionevole va bene. ad es. per una tabella di verità OR
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
uno di questi stili di input andrebbe bene:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
Stampa o restituisce un programma Stackylogic che soddisfa la tabella di verità, ovvero ha lo stesso output esatto dato lo stesso input. Qualsiasi programma finito che soddisfa quella tabella è un output valido. Non è necessario seguire il metodo di costruzione della prova induttiva. Non è necessario che i programmi Stackylogic siano brevi in modo ottimale.
Ad esempio, se l'input fosse 11100111
, un output valido sarebbe
1
?
110
?0
00
0
?<
?1
?
ma ce ne sono molti altri.
Vince il codice più breve in byte.
Vedi la sfida Stackylogic originale se hai bisogno di un interprete.