Stackylogic ist eine Programmiersprache, die ich in einer früheren Herausforderung erfunden habe : Führen Sie Stackylogic aus . Lesen Sie diesen Beitrag für alle Details und Beispiele, aber hier ist, wie es umschrieben funktioniert:
Stackylogic verwendet
0
's und1
' s für die Ein- und Ausgabe eines einzelnen0
oder1
nach Abschluss.Ein Programm besteht aus Zeilen, die nur die Zeichen
01?
sowie genau eine<
am Ende einer der Zeilen enthalten. Zeilen dürfen nicht leer sein und die Zeile mit dem<
muss mindestens eins0
haben1
, oder?
davor.Hier ist ein Beispielprogramm, das das NAND von zwei Bits berechnet :
1 ?< 11 ? 0
Jede Zeile in einem Programm wird als Stapel betrachtet , mit dem unteren Rand links und dem oberen Rand rechts. Implizit steht ein leerer Stapel (dh eine leere Zeile) vor der ersten Zeile in einem Programm und nach der letzten Zeile.
Der so
<
genannte Cursor markiert den Stapel, auf dem gestartet werden soll, wenn ein Programm ausgeführt wird. Die Ausführung erfolgt wie folgt:
Entfernen Sie das oberste Zeichen vom Stapel, auf den der Cursor gerade zeigt.
- Wenn dies der Fall ist
?
, fordern Sie den Benutzer zur Eingabe von a0
oder a auf,1
und tun Sie so, als wäre dies der Charakter.- Wenn das Zeichen ist
0
, bewegen Sie den Cursor einen Stapel nach oben (bis zur Zeile über der aktuellen Zeile).- Wenn das Zeichen ist
1
, bewegen Sie den Cursor einen Stapel nach unten (in die Zeile unter der aktuellen Zeile).Wenn der Stapel, auf den sich der Cursor bewegt, leer ist, geben Sie den letzten Wert aus, der von einem Stapel abgefallen ist (immer ein
0
oder1
), und beenden Sie das Programm.Wenn der Stapel, auf den sich der Cursor bewegt, nicht leer ist, kehren Sie zu Schritt 1 zurück und wiederholen Sie den Vorgang.
Der Schlüssel für diese Herausforderung ist, dass alle Stackylogic-Programme einer Wahrheitstabelle entsprechen . Eine vorbestimmte Anzahl von Booleschen Werten wird eingegeben und genau ein Boolescher Wert wird deterministisch ausgegeben.
Ihre Aufgabe ist es also, ein Stackylogic-Programm zu erstellen, das befriedigt oder simuliert, dh die gleiche Ausgabe wie jede gegebene Wahrheitstabelle hat. Aber es ist nicht offensichtlich , dass Stackylogic kann jede Wahrheitstabelle simulieren, also hier ist ein Beweis durch Induktion :
Base Case
Die beiden Wahrheitstabellen mit 0 Eingängen sind die Tabellen, die immer
0
oder ausgeben1
. Die Stackylogic Äquivalente dieser Tabellen sind0<
und1<
jeweils.Induktiver Schritt
Angenommen, Stackylogic kann jede Wahrheitstabelle mit N Eingängen simulieren. Sei M = N + 1.
Eine M-Eingabetabelle T kann als zwei N-Eingabetabellen T 0 und T 1 plus dem zusätzlichen Eingabebit B ausgedrückt werden . Wenn B 0 ist, wird das Ergebnis von T 0 verwendet. Wenn B 1 ist, wird das Ergebnis von T 1 verwendet.
Zum Beispiel die Wahrheitstabelle mit 3 Eingängen, die dem Pseudocode entspricht
if B: result = x OR y else: result = x NAND y
ist
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
Das sind wirklich die zwei Wahrheitstabellen mit zwei Eingängen für NAND und OR, die mit dem Muxing-Bit B übereinander gestapelt sind.
Sei S 0 und S 1 die Stackylogic-Programme, die T 0 bzw. T 1 erfüllen (wir wissen, dass diese aufgrund der ersten Annahme existieren). Das Programm S, das T erfüllt, kann dann wie folgt konstruiert werden:
[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]
Diese Anordnung wandelt effektiv zwischen S 0 und S 1 basierend auf dem ersten Eingangsbit (von der Leitung
?<
). Ist dies0
der Fall, fährt der Cursor die angehängten0
Zeichen bis zur ursprünglichen Cursorposition von S 0 hoch , die dann von leeren Stapeln oben und unten umrandet wird und somit exakt identisch mit der ursprünglichen S 0 abläuft . Wenn1
eingegeben wird, fährt der Cursor auf die Cursorposition1
von S 1 herunter und fährt mit der Ausführung fort, als ob er alleine wäre.Zum Beispiel sind Stackylogic-Programme für OR und NAND
? ?<
und
1 ?< 11 ? 0
Sie können zu Simulationszwecken kombiniert werden
if B: result = x OR y else: result = x NAND y
wie so:
1 ? 110 ?0 00 0 ?< ?1 ?
Somit kann jede Wahrheitstabelle durch ein Stackylogic-Programm simuliert werden.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Wahrheitstabelle mit N Eingängen (N> 0) in Form einer Liste von 2 N Booleschen Werten aufnimmt , die die Ausgaben der Tabelle in aufsteigender binärer Reihenfolge darstellen.
Jedes sinnvolle Eingabeformat ist in Ordnung. zB für eine ODER Wahrheitstabelle
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
Jeder dieser Arten von Eingaben wäre in Ordnung:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
Ein Stackylogic-Programm ausgeben oder zurückgeben, das die Wahrheitstabelle erfüllt, dh die exakt gleiche Ausgabe bei gleicher Eingabe hat. Jedes endliche Programm, das diese Tabelle erfüllt, ist eine gültige Ausgabe. Sie müssen die Konstruktionsmethode des Induktionsnachweises nicht befolgen. Die Stackylogic-Programme müssen nicht optimal kurz sein.
Wenn zum Beispiel die Eingabe 11100111
wäre, wäre eine gültige Ausgabe
1
?
110
?0
00
0
?<
?1
?
aber es gibt noch viele andere.
Der kürzeste Code in Bytes gewinnt.
Sehen Sie sich die ursprüngliche Stackylogic-Herausforderung an, wenn Sie einen Dolmetscher benötigen.