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.
quelle
Antworten:
Pyth, 53 Bytes
Versuchen Sie es online
Dies ist eine genaue Implementierung des Systems, das in der Aufforderung zur Implementierung beliebiger Wahrheitstabellen in Stackylogic beschrieben wurde. Wir halbieren einfach die Wahrheitstabelle, implementieren sie rekursiv und hängen dann 0 und 1 an.
Dies definiert eine rekursive Funktion, deren Rückgabewert ist
[1, ['0', '?', '1']]
, wobei die erste Zahl die Position des Zeigers ist und der Rest ein Stackylogic-Programm ist.quelle
Python 3,
352208205 BytesDies ist immer noch sehr unrühmlich, und ich werde später versuchen, eine Erklärung hinzuzufügen.Nach einigen Änderungen konnte ich144147 Bytes entfernen .Eine Funktion
f
, die die Eingabe der Wahrheitstabellenwerte als eine Liste von Booleschen Werten der Form annimmt['1','1','1','0','0','1'...]
, in der'1'
wahr und'0'
falsch ist, und ein Stackylogic-Programm zurückgibt.Probieren Sie es auf Ideone
Wenn Sie ein erstelltes Programm testen möchten, können Sie hier den Convex-Interpreter von GamrCorps verwenden .
Wie es funktioniert
Dies ist eine rekursive Funktion und verwendet die in der Frage beschriebene induktive Methode.
Auf der Ebene
a
dern/2
a+1
nullindizierten Rekursion erstellt die Funktion Stackylogic-Programme mit Eingabe aus denn
a
Eingabeprogrammen in der Liste. Dies geschieht, indem alle benachbarten Paare von zwei Programmen in der Liste mit?
; da sich der Cursor immer auf dem mittleren Element jedes einzelnen Programms befindet, kann das erforderliche Anhängen von0
oder1
durchgeführt werden, indem über jede Zeile der zu verbindenden Programme iteriert und angehängt wird, wenn der Index der aktuellen Zeile kleiner oder gleich / größer ist als oder gleich dem mittleren Index. Wenn die Liste nur zwei Programme enthält, gibt der nächste rekursive Aufruf das endgültige Programm aus. da dies einen Cursor erfordert, erfolgt die Verknüpfung stattdessen am?<
.Wenn die Liste eine Länge hat
1
, darf die Liste nur ein Element enthalten, das das vollständige Programm enthält. Daher werden alle Zeilen im Programm in einer neuen Zeile zusammengefasst und dann zurückgegeben.Ein Beispiel soll dies verdeutlichen:
quelle