Stackylogic ist eine logikbasierte Programmiersprache, die ich erfunden habe 0
und die Ein 1
- und Ausgänge für eine einzelne 0
oder 1
nach Fertigstellung enthält.
Ein Stackylogic-Programm besteht aus Zeilen, die nur die drei Zeichen 01?
sowie genau eines <
am Ende einer der Zeilen enthalten können. Zeilen dürfen nicht leer sein und die Zeile mit dem <
muss mindestens eins 0
haben 1
, oder ?
davor.
Hier ist ein Beispielprogramm, das (wie ich erklären werde) das NAND von zwei Bits berechnet :
1
?<
11
?
0
Jede Zeile in einem Stackylogic-Programm wird als Stapel betrachtet , mit dem unteren Rand links und dem oberen Rand rechts. Implizit steht ein leerer Stapel (leere Zeile) vor der ersten Zeile in einem Programm und nach der letzten Zeile.
Das Symbol <
, das wir als Cursor bezeichnen , markiert den Stack, auf dem gestartet werden soll, wenn ein Stackylogic-Programm ausgeführt wird. Die Ausführung eines Stackylogic-Programms erfolgt wie folgt:
Entfernen Sie das oberste Zeichen vom Stapel, auf den der Cursor gerade zeigt.
- Ist dies der Fall
?
, 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).
- Ist dies der Fall
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.
Beachten Sie, dass Stackylogic-Programme immer enden, da sie ihre Stacks letztendlich entleeren müssen.
NAND-Beispiel
Im NAND-Programm startet der Cursor auf einem ?
:
1
?<
11
?
0
Wir werden die Benutzereingaben ein nehmen , 1
sobald die ?
aufgetaucht ist, was bedeutet , dass der Cursor nach unten bewegen wird, so dass das Programm wie folgt aussehen:
1
11<
?
0
Jetzt befindet sich eine Ebene 1
oben auf dem Cursorstapel. Es wird ordnungsgemäß geknallt und der Cursor bewegt sich erneut:
1
1
?<
0
Nehmen wir nun die Benutzereingaben 0
für an ?
, was bedeutet, dass sich der Cursor nach oben bewegt:
1
1<
0
Wieder 1
befindet sich a auf dem Cursorstapel, sodass der Cursor springt und sich nach unten bewegt:
1
<
0
Schließlich ist der Cursor-Stapel leer, so dass der letzte Wert 1
ausgegeben wird und das Programm endet.
Dies ist genau für ein NAND-Gatter, weil es 1 NAND 0
ist 1
. Dies funktioniert natürlich auch für die anderen drei Zwei-Bit-Eingänge, wenn Sie dies überprüfen möchten.
ODER Beispiel
Dieses Stackylogic-Programm simuliert ein ODER- Gatter:
?
?<
Es ist leicht zu erkennen, dass bei der ersten Eingabe von 1
der Cursor auf den impliziten leeren Stapel unterhalb der letzten Zeile bewegt wird, wodurch das Programm beendet und der 1
gerade eingegebene ausgegeben wird.
Bei einer Eingabe von 00
hingegen bewegt sich der Cursor zum impliziten leeren Stapel oben, beendet das Programm und gibt den zuletzt 0
eingegebenen aus.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die ein Stackylogic-Programm als Zeichenfolge aufnimmt und es ausführt und das resultierende 0
oder ausgibt oder zurückgibt 1
.
Bei ?
können Sie den Benutzer zur Eingabe von a 0
oder 1
auffordern oder den Wert aus einer voreingestellten Zeichenfolge von 0
s und 1
s lesen, die Sie auch als Eingabe verwenden. (Dies kann eine weitere Zeichenfolge sein, die in Ihr Programm / Ihre Funktion eingegeben wird, oder Sie können einfach davon ausgehen, dass die erste oder letzte Zeile der Programmzeichenfolge der Eingabestream ist.)
Sie können davon ausgehen, dass das Programm und die Eingabe immer gut geformt sind. Sie können optional davon ausgehen, dass Eingabeprogramme mit einer einzelnen nachgestellten Zeile versehen sind (denken Sie jedoch daran, dass am Ende immer ein impliziter leerer Stapel steht).
Der kürzeste Code in Bytes gewinnt.
Weitere Beispielprogramme
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?<\??
. Alternativ ist hier eine symmetrische 5-Zeilen-Implementierung:?\?0\?<\?1\?