Diese Challenge wurde im Rahmen der LotM-Challenge im April 2018 veröffentlicht
Brain-Flak ist eine Turing-Tarpit-Sprache, die hier bei PPCG viel Ruhm erlangt hat. Die Erinnerung an die Sprache besteht aus zwei Stapeln, aber ein "versteckter" dritter Stapel wurde entdeckt von Wh e at Wizard entdeckt , was zu einigen interessanten neuen Denkweisen für Brain-Flak-Programme führte.
Wie wäre es also damit, diesem armen, versteckten dritten Stapel mehr Sichtbarkeit zu verleihen? Lassen Sie uns eine Sprache erstellen, in der der dritte Stapel die Anerkennung erhält, die er verdient! Hier präsentiere ich euch Third-Flak .
Die Sprache
In Third-Flak gibt es nur einen Stapel, den dritten Stapel. Die Betreiber arbeiten auf dem dritten Stapel in der gleichen Art , wie sie in Brain-Flak, aber hier gibt es keine []
,{}
, <>
nilads und keine {...}
Monade (so die einzigen zulässigen Zeichen in einem Third-Flak - Programm sind ()[]<>
). Hier ist, was jeder Operator tut (Beispiele werden gegeben, die den dritten Stapel mit einer Liste darstellen, in der das letzte Element die Oberseite des Stapels ist):
()
ist der einzige zweistellige Operator in Third-Flak. Es erhöht die Oberseite des dritten Stapel von 1. Beispiel:[1,2,3]
→[1,2,4]
(
,[
,<
: Alle Öffnungs Klammern , die nicht von dem vorherigen Fall Push a abgedeckt sind0
zu dem dritten Stapel. Beispiel:[1,2,3]
→[1,2,3,0]
)
Knackt zwei Elemente aus dem dritten Stapel und drückt ihre Summe zurück. Beispiel:[1,2,3]
→[1,5]
]
Fügt zwei Elemente aus dem dritten Stapel hinzu und schiebt das Ergebnis des Subtrahierens des ersten von dem zweiten zurück. Beispiel:[1,2,3]
→[1,-1]
>
Öffnet ein Element aus dem dritten Stapel. Beispiel[1,2,3]
→[1,2]
Und hier sind die anderen Regeln der Sprache:
Zu Beginn der Ausführung enthält der dritte Stapel nur eine einzige 0.
Es ist verboten, leer zu haben
[]
oder<>
innerhalb eines Programms (sie wären sowieso Noops, wenn sie der Semantik von Third-Flak folgen, aber sie haben tatsächlich eine andere Bedeutung in Brain-Flak, die hier nicht wiederhergestellt werden kann).Klammern müssen immer ausgeglichen sein, mit Ausnahme der Tatsache, dass abschließende Klammern am Ende des Programms fehlen können. Als Beispiel
[()<(()
ist ein gültiges Third-Flak-Programm (und der dritte Stack am Ende des Programms wäre[1,0,1]
).Ein Programm kann nur die sechs zulässigen Zeichen enthalten
()[]<>
. Programme dürfen garantiert nicht leer sein.
Hinweis: Die vorherigen Regeln implizieren, dass Sie sich nicht mit Situationen befassen müssen, in denen Sie von einem leeren Stapel abspringen müssen.
Die Herausforderung
Einfach, schreibe einen Interpreter für Third-Flak. Ihr Programm muss als Eingabe ein Third-Flak-Programm annehmen und als Ausgabe den Status des dritten Stapels am Ende des Programms zurückgeben.
Ihr Ausgabeformat ist flexibel, solange es möglich ist, den Status des dritten Stapels eindeutig auszulesen und die gleiche Nummer immer auf die gleiche Weise zu codieren zu versuchen zu betrügen ist in Ordnung).
Ihre Ausgabewahl kann den Bereich der Nummern einschränken, die Sie verwalten können, solange dies die Herausforderung nicht trivialisiert (da dies der Fall wäre) eine Standardlücke ).
Testfälle
Für jeden Testfall ist die erste Zeile die Eingabe und die zweite Zeile der Ausgabestapel, der als durch Leerzeichen getrennte Liste von Zahlen dargestellt wird, wobei die Oberseite des Stapels das letzte Element ist.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
quelle
[()]
verstößt es gegen die Regel, dass wir uns nicht darum kümmern müssen, von einem leeren Stapel zu springene
ist hier .Antworten:
Brain-Flak , 276 Bytes
Probieren Sie es online!
Sie mussten wissen, dass dies kommen würde.
quelle
Retina 0.8.2 ,
644846 BytesProbieren Sie es online! Gibt den Stapel von unten nach oben aus. Funktioniert nur mit nicht negativen ganzen Zahlen, und der letzte Testfall ist zu langsam, sodass der Link nur drei Testfälle enthält. Erläuterung: Der Stapel steht implizit vor dem Programm, daher beginnt er als leere Zeichenfolge, die eine einzelne Null darstellt. Der Nullpunkt wird in einen verwandelt, der zum unären Zählen verwendet wird, während die anderen offenen Klammern in Zeilenumbrüche umgewandelt werden, die eine Null auf den Stapel aufschieben, wenn sie angetroffen werden. Die geschlossenen Klammern werden dann einzeln verarbeitet, damit der Stapel korrekt ist. Daslöscht nur das oberste Element. Schließlich wird der Stapel in eine Dezimalzahl konvertiert. Bearbeiten: 2 Bytes dank @Leo gespeichert.
()
_
)
löscht die vorherige Zeile, fügt die beiden obersten Elemente zusammen, der]
löscht das oberste Element und gleicht es mit dem vorherigen Element auf dem Stapel ab, wodurch es subtrahiert wird>
quelle
$3
? (Gute Antwort, trotzdem!)Python 3 ,
145 144 132 122 116 109104 Bytes-7 Bytes dank Leo!
Und - 5 danke an Lynn!
Probieren Sie es online!
Ziemlich Standardimplementierung.Aber jetzt nicht so lesbar. Ich bin enttäuscht, dass ich keinen kürzeren Weg finden konnte, um zwischen Anfangs- und Endklammer zu prüfen.Einige Einzeiler-Versuche:
124 Bytes (anonyme Funktion):
115 Bytes (volles Programm):
Append ist ärgerlich länger als normale Zuweisung
quelle
~-']>)'.index(i)
kann sein(2-ord(i)%5)
, 4 Bytes zu sparen.Ruby ,
9891 BytesProbieren Sie es online!
Mein anfänglicher Code funktionierte im Geiste ähnlich wie Jo Kings Python-Antwort, sodass wir vor dem Durchlaufen der Quell-Zeichen alle ersetzten
()
Teilzeichenfolgen durch ein anderes Zeichen als eindeutigen Operator .Zumindest in Ruby stellte sich jedoch heraus, dass Golfer dies nicht tun, sondern sich eher für eine etwas umständlichere Herangehensweise entscheiden. Hier pflegen wir einen zusätzlichen Indexer
i
, der unsere Position in der Quellzeichenfolge verfolgt, und wann immer eine öffnende Klammer angetroffen wird, prüfen wir im Voraus, ob unsere aktuellen + nächsten Zeichens[i,2]
den()
Operator bilden. In diesem Fall legen wir 1 anstelle von 0 auf den Stapel und lassen das Schließen)
im nächsten Schritt seinen Job erledigen.quelle
05AB1E , 25 Bytes
Probieren Sie es online!
Erläuterung
quelle
SOGL V0.12 , 34 Bytes
Probieren Sie es hier aus!
quelle
R ,
182177 BytesProbieren Sie es online!
Gibt den Stapel zurück, wobei der obere Teil des Stapels der erste und der untere Teil des Stapels der letzte ist.
Tauscht
()
mit7
und berechnet dann die Codepunkte Mod 8, um eindeutige numerische Werte zu erhalten, mit denen einfacher und besser gearbeitet werden kann als mit Zeichenfolgen.Es ist besser, mit dem Anfang eines Vektors in R zu arbeiten, also konstruieren wir den Stapel auf diese Weise.
Dann sieht es ein
)
, oder wennk==1
es eine zusätzliche Null an der Spitze des Stapels hinzufügt, da es Golfspieler ist, es hinzuzufügen und zu entfernen.quelle
CJam , 29 Bytes
Probieren Sie es online!
quelle
Ceylon,
285266 BytesProbieren Sie es online!
(19 Byte aufgrund eines Vorschlags von Leo gespeichert.)
Formatiert und kommentiert:
Probieren Sie es online!
quelle