Brain-Flak (eine Kreuzung zwischen Brainf ** k und Flak-Overstow) ist eine stapelbasierte esoterische Sprache. Seitdem diese Herausforderung veröffentlicht wurde, hat sich die Sprache weiterentwickelt und aktualisiert, aber diese erste Überarbeitung der Sprache ist als "Brain-Flak-Klassiker" bekannt.
Sie müssen ein Programm oder eine Funktion schreiben, die eine Zeichenfolge aus klassischem Brain-Flak-Code verwendet und auswertet. Es wird auch eine (möglicherweise leere) Liste von ganzen Zahlen erstellt. Es gibt die Eingänge zum klassischen Programm von Brain-Flak.
Die Sprache
Brain-Flak hat zwei Stapel, die als "links" und "rechts" bekannt sind. Der aktive Stapel beginnt links. Wenn ein leerer Stapel abgefallen ist, wird 0 zurückgegeben. Es gibt keine Variablen. Wenn das Programm startet, wird jede Eingabe der Reihe nach auf den aktiven Stapel gelegt (so dass die letzte Eingabe über dem Stapel liegt).
Die einzigen gültigen Zeichen in einem Brain-Flak-Programm sind ()[]{}<>
, und sie müssen immer ausgeglichen sein . Wenn ungültige Zeichen vorhanden sind oder die Klammern nicht übereinstimmen, tritt undefiniertes Verhalten auf. Alles ist gültig.
Es gibt zwei Arten von Funktionen: Niladen und Monaden . Ein Nilad ist eine Funktion, die 0 Argumente akzeptiert . Hier sind alle Niladen:
()
+1.[]
-1.{}
Pop den aktiven Stapel.<>
Schaltet den aktiven Stapel um.
Diese werden bei der Auswertung miteinander verkettet. Wenn wir also eine '3' über dem aktiven Stapel hatten, lautet dieser Ausschnitt:
()(){}
würde auswerten, zu 1 + 1 + active.pop()
welcher würde auswerten, zu 5. <>
auswertet, zu 0.
Die Monaden nehmen ein Argument, einen Teil des Brain-Flak-Codes. Hier sind alle Monaden:
(n)
Drücken Sie 'n' auf dem aktiven Stapel.[n]
'N' als Int und Newline ausgeben.{foo}
Während active.peek ()! = 0 ist, mach foo. Wertet auf 0¹ aus.<foo>
Foo ausführen, aber mit 0 bewerten.
Diese Funktionen geben also auch den Wert in ihnen zurück
(()()())
Drücke 3 und
[()()()]
Druckt aber 3
[(()()())]
Druckt und drückt 3.
Wenn das Programm ausgeführt ist, wird jeder auf dem aktiven Stapel verbleibende Wert als Ganzzahl mit einem Zeilenumbruch zwischen gedruckt. Werte auf dem anderen Stapel werden ignoriert.
Regeln:
Ihr Programm muss Zahlen im Bereich (-128, 127) und eine Stapelgröße von mindestens 255 unterstützen. Wenn Sie größere unterstützen, ist dies großartig.
Unterlauf / Überlauf ist undefiniert.
Beispiel IO:
Das leere Programm:
Eingabe: Keine
Ausgabe: Keine
Zusatz. Quelle:
({}{})
Eingang:
2, 3
Ausgabe:
5
Subtraktion. Quelle:
({}<>){({}[])<>({}[])<>}<>
Eingang:
2, 3
Ausgabe:
-1
Multiplikation. Quelle:
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>
Eingang:
7, 8
Ausgabe:
56
Fibonacci. Quelle:
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>
Eingang:
5
Ausgabe:
13
8
5
3
2
1
1
{[({})]}
Es gelten Standardlücken, und die kürzeste Antwort in Bytes gewinnt.
- ¹: Das war tatsächlich ein Fehler von meiner Seite.
{...}
sollte die Summe aller seiner Läufe auswerten, was meiner Meinung nach eines der coolsten Features von Brain-Flak ist. Nehmen Sie jedoch für die Zwecke dieser Abfrage an, dass{...}
als 0 ausgewertet wird.
quelle
{...}
wertet die Monade aus ?{...}
mit 0 bewertet. Außerdem werden die Argumente der Reihe nach gepusht, also2
wird gepusht und dann3
gepusht. Wenn das Programm gestartet wird, befindet sich die zweite Eingabe (3
) oben auf dem Stapel. Ich werde beide in der Post klären.Antworten:
Pip
-n
,15114810198 BytesÜbernimmt die Liste der Eingaben als Befehlszeilenargumente und den Brain-Flak-Code aus (einer Zeile von) stdin. Probieren Sie es online!
Bearbeiten: Durch den Wechsel zu einer Übersetzungs- und Evaluierungsstrategie wurden viele Bytes gegenüber meinem ursprünglichen Ansatz gespart.
Ungolfed und kommentiert
Diese Version enthält auch einige Debug-Ausgaben, die den aus der Übersetzung resultierenden Pip-Code sowie den Stapelinhalt nach der Ausführung anzeigen.
quelle
Brain-Flak Classic ,
127112471239 BytesProbieren Sie es online!
+4 Bytes vom Beheben eines Fehlers mit der Bedingung in der
{...}
Monade und -36 Bytes von verschiedenen Golfplätzen.1238 Byte Code, +1 Byte für das
-a
Flag (das mit dem Sprachflag kombiniert werden kann).Dies wird nun
{...}
gemäß der Herausforderungsspezifikation als Null bewertet . Beachten Sie, dass Brain-Flak selbst{...}
als Summe aller Läufe seit dem Bugfix vom 7. Mai 2016 zwei Tage vor Veröffentlichung dieser Herausforderung ausgewertet wurde.Der folgende Code interpretiert Brain-Flak Classic korrekt
{...}
als die Summe aller Läufe. Der einzige Unterschied zwischen den beiden Dolmetschern ist die Platzierung einer{}
Null.Probieren Sie es online!
Eingabe (für jeden Interpreter) ist das zu interpretierende Brain-Flak Classic-Programm, dann eine neue Zeile und dann eine durch Leerzeichen getrennte Liste von ganzen Zahlen. Für die Eingabe wird keine Validierung durchgeführt. Die neue Zeile ist erforderlich, auch wenn das Programm oder die Eingabe leer ist.
Der erste Schritt ist das Parsen aller Eingaben, beginnend mit den Klammern:
Dann werden die ganzen Zahlen analysiert. Dies wäre normalerweise nicht erforderlich, aber die Eingabe wurde als ASCII-Zeichen verwendet. Dies hat jedoch einen silbernen Strich: Die Texteingabe ermöglicht es uns, die Stapelhöhe zu bestimmen, was die Dinge vereinfacht, wenn wir keinen Zugriff auf die Stapelhöhe Null haben.
Ganzzahlen werden im zweiten Stapel in zwei Zahlen zerlegt: eine für den absoluten Wert und eine für das Vorzeichen. Diese werden dann zurück zum ersten Stapel verschoben.
Die interpretierten Stapel werden unter dem Code auf dem ersten Stapel in der folgenden Reihenfolge gespeichert: aktuelle Stapelhöhe, aktueller Stapel, andere Stapelhöhe, anderer Stapel. Die 0 für die andere Stapelhöhe muss an dieser Stelle nicht verschoben werden, da sie beim ersten Lesen eine implizite Null ist.
Die Darstellung des Codes wird nun wieder in den linken Stapel verschoben. Um es später einfacher zu machen, subtrahieren wir 4 von den öffnenden Klammern der Nullen, sodass jede Operation eine eindeutige Ganzzahl von -1 bis -8 hat.
Der Hauptteil des Programms ist die Interpretation der Anweisungen. Zu Beginn jeder Iteration der Hauptschleife befindet sich der aktuelle Befehl oben auf dem linken Stapel, alles, was sich darunter befindet, auf demselben Stapel und alles, was sich davor auf dem rechten Stapel befindet. Ich neige dazu, mir vorzustellen, dass ein Buch für eine bestimmte Seite geöffnet ist.
Nach dem Verlassen der Hauptschleife befindet sich der gesamte Code auf dem rechten Stapel. Die einzigen Dinge auf dem linken Stapel sind eine Null und die beiden interpretierten Stapel. Es ist ganz einfach, die richtige Ausgabe zu erstellen.
quelle
{...}
, das ist das korrekte Verhalten für moderne Brain-Flak- und (ich denke) Brain-Flak-Klassiker, aber ich habe in der Herausforderung geschrieben, dass{...}
die mit 0 bewertet wird durch Entfernen dieser Funktionalität, obwohl es schön wäre, das Original zu behalten, da es im Allgemeinen technisch korrekter ist (nur falsch für diese Herausforderung)APL,
255257 BytesDies nimmt das Programm als rechtes Argument und die Programmeingabe als linkes Argument, dh:
Ungolfed-Version: hier .
quelle
APL (Dyalog Classic) , 146 Byte
Probieren Sie es online!
ein Klassiker interpretiert einen anderen :)
quelle
Python 3, 429 Bytes
Gebraucht wie
g('[{}{}]', 2, 3)
Es wird verwendet
re.sub
, um die Brain-Flak-Quelle in Python zu "kompilieren" und dann das Python auszuführen. (für Debugging, ersetzenexec
mitprint
einer Auflistung des Python - Code zu bekommen)Wenn verschachtelte while-Schleifen ordnungsgemäß eingerückt werden, werden viele Bytes im Code verbraucht.
quelle
Python, 616 Bytes
Anleitung:
[1,2,...]
Format ein und drücken Sie die EingabetasteGrundsätzlich "kompiliert" dieses Programm den Brain-Flak-Code rekursiv in verschachtelte Listen und interpretiert diese Liste rekursiv. Es gibt wahrscheinlich eine Möglichkeit, die beiden zu kombinieren ...
Ich werde später versuchen, die Logik zu überarbeiten.
quelle
Perl 5.6,
419414 BytesIch habe ein bisschen Golf gespielt, aber es gibt wahrscheinlich Raum für Verbesserungen. Hier wurden Zeilenumbrüche und Tabulatoren hinzugefügt, um die Lesbarkeit zu verbessern:
quelle
Python 2 ,
361, 348 BytesProbieren Sie es online!
-13 Bytes gespart dank @Mr. Xcoder!
quelle