Schreiben Sie einen Dolmetscher für 2B
Ich mag David Catt 's esoterische Sprache 2B, bei der der Speicher auf einem Band gespeichert ist, in dem jede Zelle ein einzelnes Band von Bytes ist (das "Subtape"). Schreibe einen Dolmetscher dafür!
Sprachspezifikation
Die offizielle Spezifikation finden Sie hier . In dieser Beschreibung "
bedeutet eine Zahl im Bereich 0-9
( 0
wird interpretiert als 10
) und _
bedeutet eine Zeichenfolge beliebiger Länge. In jeder Zelle wird ein Wert im Bereich gespeichert 0-255
, und Überlauf / Unterlauf werden wie bei einem BF umbrochen. (Danke @ MartinBüttner). 0-255
Verwenden Sie ASCII-Codes, um Text in Zahlen umzuwandeln . Da ich keine Details dazu finden kann, werde ich sagen, dass die Bandlänge 255
minimal sein sollte, aber wenn Sie etwas anderes wissen, bearbeiten Sie es bitte.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction | Description |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0 | Zeroes the current cell and clears the overflow/underflow flag. |
| { | If the current cell is zero, jump to the matching }. |
| } | A placeholder for the { instruction. |
| ( | Read a byte from the input stream and place it in the current cell. |
| ) | Write the value of the current cell to the console. |
| x | Store the value of the current cell in a temporary register. |
| o | Write the value of the temporary register to the console. |
| ! | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ? | Performs a binary NOT on the current cell. |
| +" | Adds an amount to the current cell. |
| -" | Subtracts an amount from the current cell. |
| ^" | Moves the subtape up a number of times. |
| V" | Moves the subtape down a number of times. |
| <" | Moves the tape left a number of times. |
| >" | Moves the tape right a number of times. |
| :_: | Defines a label of name _. |
| *_* | Jumps to a label of name _. |
| ~_~ | Defines a function of name _. |
| @_@ | Calls a function of name _. |
| % | Ends a function definition. |
| #_# | Is a comment. |
| [SPACE] | Is an NOP. |
| [NEWLINE] | Is treated as whitespace and removed. |
| [TAB] | Is treated as whitespace and removed. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
Tests
+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)
Sollte ausgeben Hello world!
+1:i:{()*i*}
Eine Art cat
Programm, nur ohne Zeilenumbruch.
+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%
Sollte zuerst ein Name akzeptiert werden, dann sollte beim Drücken von Returnausgegeben werden Hello name
(wobei Name das ist, was eingegeben wurde).
Der Kredit für dieses Programm geht an David Catt .
Ich arbeite an einem vollständigen Testprogramm.
Regeln
- Standardlücken sind verboten
- Ihr Dolmetscher muss alle Spezifikationen erfüllen, mit Ausnahme von Kommentaren, die nicht erforderlich sind.
Wertung
- Das ist Code-Golf , also gewinnen die wenigsten Bytes!
- -10 Byte, wenn Ihr Interpreter Kommentare verarbeitet.
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
quelle
Antworten:
Python2,
748736731709704691 BytesDas war eine lustige kleine Herausforderung, ich bin sicher, ich kann diesen Code noch kürzer machen (vielleicht mache ich das später).
Diese Implementierung erfordert, dass Labels und Funktionen deklariert (implementiert) werden, bevor sie aufgerufen werden. Es funktioniert perfekt mit den beiden angegebenen Tests, aber es funktioniert leider nicht mit dem "SayHi.2b" -Programm, das vom Autor der Sprache geschrieben wurde (auch nach Änderung der Reihenfolge der Deklaration der Funktionen). Ich denke, dieses Problem hängt möglicherweise damit zusammen, wie ich das Tape- und Subtape-System verstanden habe. Wird beim Bewegen entlang des Hauptbands die Position auf dem entsprechenden Unterband auf 0 zurückgesetzt? Im Moment behalte ich die Position auf dem Teilband, auch wenn ich mich auf dem Hauptband bewege.
Hier ist die besser lesbare Version:
Bearbeiten: Berücksichtigen Sie die Behandlung von Kommentaren (-10 Bytes) und beheben Sie einen Fehler, der um eins ausfällt. Diese Implementierung unterstützt keine verschachtelten Funktionsaufrufe (ich könnte es implementieren, wenn es eine erforderliche Funktion ist)
Edit2: Die Handler-Funktion wurde geändert, um Addition, Subtraktion und Zellenbewegung durchzuführen. Mehr Lambdas! : D (Die "besser lesbare Version" ist möglicherweise nicht mehr synchron)
Edit3: Mir ist gerade klar geworden, dass die Bearbeitung von Kommentaren 5 Bytes kostet (unter Berücksichtigung der -10). Also habe ich es gerade entfernt, es ist schade, dass es sich jetzt unvollständig anfühlt.
Edit4: Definition von n von Lambda nach Var im Handler verschoben h ()
quelle
+a+
es vielleicht besser, mitzumachena
? Es würde auch Sie loswerden, wenn Sie es einem var zuweisen müssten.SayHi.2b
Datei zum Laufen zu bringen . Was passiert, wenn es geändert wird, um das Teilband bei einer Schicht auf Null zurückzusetzen?