Ich habe esoterische Sprache Jumper ausgedacht. Später werden Sie sehen warum.
- Es arbeitet mit Direktzugriffsspeicher mit Bytes als Zellen. Der RAM ist nullindexiert und anfangs mit Nullen gefüllt.
- Beim Versuch, auf Zellen mit negativen Indizes zuzugreifen, sollte ein Fehler angezeigt und das Programm beendet werden.
- Wenn Sie versuchen, mit einem größeren Index als dem letzten zu lesen, sollte Null zurückgegeben werden.
- Wenn Sie versuchen, mit einem größeren Index als zuletzt zu schreiben, sollten Sie den RAM auf ein Vielfaches von 1024 und die Anzahl der mit Nullen gefüllten neuen Zellen erhöhen kann es nicht zu vielfachen von 1024).
- Das Programm hat auch einen Zeiger auf die Zelle im RAM, die anfänglich Null ist
- Wenn das Programm mit der Ausführung beginnt, sollte eine Eingabeaufforderung für eine Zeichenfolge angezeigt werden (oder Sie können Eingaben über Befehlszeilenargumente vornehmen). Die Eingabezeichenfolge darf kein Nullzeichen (null Byte) enthalten. Dann wird die Eingabezeichenfolge beginnend mit dem Index Null in den RAM geschrieben.
- Wenn das Programm die Ausführung beendet, wird eine Box mit Programmausgabe angezeigt - Inhalt des RAM vom Index Null bis zum ersten Byte Null außer.
Nun zum interessantesten Teil, der Syntax.
Das Programm besteht aus Befehlen (unäre Operatoren-Präfixe) und deren Argumenten. Befehle und Argumente können durch Leerzeichen oder neue Zeilen getrennt werden, sind jedoch nicht erforderlich. Leerzeichen in Argumenten sind beispielsweise ungültig, # 2 = 4
sind jedoch # 2 = 4 4
nicht gültig .
Das Programm kann Kommentare zwischen haben ()
. Kommentare können nicht verschachtelt werden - beispielsweise in (abc(def)ghi)
comment is (abc(def)
. Kommentare können überall platziert werden.
#123
Setzt den RAM-Zeiger auf 123 (jede positive Dezimalzahl oder Null).>123
erhöht den RAM-Zeiger um 123 (jede positive Dezimalzahl).<123
dekrementiert den RAM-Zeiger um 123 (jede positive Dezimalzahl).=123
schreibt 123 (eine beliebige 8-Bit-Dezimalzahl ohne Vorzeichen) in die aktuelle Zelle.+123
Fügt der aktuellen Zelle 123 (eine beliebige 8-Bit-Dezimalzahl ohne Vorzeichen) hinzu (Modulo 256).-123
Subtrahiert 123 (eine beliebige 8-Bit-Dezimalzahl ohne Vorzeichen) von der aktuellen Zelle (Modulo 256).:123
- "goto" - geht zur Befehlsnummer 123 (die erste ist 0). Sie können den Ablauf Ihres Programms nur mit goto's steuern - es muss springen - deshalb habe ich mich entschlossen, diese Sprache Jumper zu nennen.
Wenn das Argument fehlt, ist es 1 für ><+-
Befehle oder 0 für #=:
Befehle.
Außerdem gibt es den Befehlsmodifikator - ?
(Präfix für Befehl), der den nächsten Befehl nur ausführt, wenn die aktuelle Zelle nicht Null ist, andernfalls wird dieser Befehl übersprungen. Kann auf jeden Befehl angewendet werden.
Zum Beispiel geht ?:17
- zu Befehl 17, wenn die aktuelle Zelle nicht Null ist.
Wenn das Programm ungültig ist oder während der Laufzeit ein Fehler auftritt, kann die Meldung "Fehler" angezeigt werden. Aus diesem Grund ist CodeGolf eine gute Nachricht.
Deine Aufgabe
Schreiben Sie den kürzesten Dolmetscher für diese Sprache.
Einige Testprogramme
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
quelle
Antworten:
Ruby, 447 Bytes
Übernimmt sowohl das Programm als auch die Eingabe über Kommandozeilenargumente.
BEARBEITEN: Es wurden einige Fehler behoben und die Unterstützung für ungültige Syntax auf Kosten von 40 Byte hinzugefügt (während einige andere Optimierungen hinzugefügt wurden).
quelle
Python (729)
Zum Ausführen des Programms:
Beispiel:
Es gibt wahrscheinlich ein paar Dinge, die ich übersehen habe. Bitte hinterlassen Sie einen Kommentar, wenn Sie etwas ausprobieren, das funktionieren sollte, aber nicht funktioniert. Beachten Sie, dass dies in Python 2.x-Code geschrieben ist.
quelle
Ruby 2 -
540447420 ZeichenAls "ruby2.0 jumper.rb" -Anweisung "Initialisierungsdaten" ausführen. 1.x Ruby funktioniert nicht (keine String.bytes-Methode).
Mehrzeilige Befehle und Kommentare hinzugefügt und das Putten verbessert.
Hier ist eine Testsuite mit einigen Scatter-Shot-Tests. Am einfachsten ist es, den Code in t / jumper.t einzufügen und "perl t / jumper.t" auszuführen.
Ungolfed-Version.
Ein schneller Proto-Assembler.
quelle
Clojure -
585577 BytesKeine speziellen Golftricks verwendet, da ich keine für Clojure kenne. Der Dolmetscher ist rein funktional. Kommt mit einer schönen Fehlermeldung im Falle einer negativen RAM-Adresse verpackt (ein Fehler wird ausgegeben, aber keine Ausnahmen oder Fehler werden geworfen).
Beispiele:
Originalleicht ungolfter Code:quelle
-
das Zeichen am Ende der Zeichenklasse Ihres Regex setzen, müssen Sie es nicht entziehen. -1 Zeichen.Kaffeeskript (465)
Das erste Eingabefeld ist für das Programm und das zweite Eingabefeld wird eingegeben. Testen Sie es unter http://coffeescript.org .
Original :
Dies ist immer noch Golf, aber kommentiert:
Edit : Das Hinzufügen von Leerzeichen hat mehr Bytes gedauert als ich dachte. Dieser Interpreter gibt einen Fehler bei ungültiger Syntax aus. Der andere Interpreter weist ein nicht angegebenes Verhalten bei ungültiger Syntax auf.
quelle
?:2 :4 >1 :0 = 33 <10 =0
(das Append-! -Programm mit einem zusätzlichen Leerzeichen)<1
nicht sein<10
.Javascript, 519
Dies ruft das Programm ab und gibt es über Eingabeaufforderungsfelder ein. Das Einfügen in die Javascript-Konsole Ihres Browsers funktioniert ebenso wie das Einfügen in eine Datei, das Einfügen vor dem Code
<!DOCTYPE html>
, dem Zeilenumbruch<html><head><script>
und nach dem Code</script></head><body></body></html>
und das Speichern der resultierenden Datei als "swagger.html".Dies ist mein erster Versuch, und ich mag die Sprache bereits. Irgendwie. Anstelle dieser BASIC-artigen Indexbeschriftung für Anweisungen sind jedoch Textbeschriftungen erforderlich.
Ungolfed Version (irgendwie):
quelle
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
(das Anhängen! Mit einem zusätzlichen Leerzeichen). Allerdings nicht getestet.C 687 GCC 4.9.0 und Visual C ++ 2013 (wenn Zeilenenden als 1 zählen)
Edit: Dank Dennis ist es jetzt viel kürzer (und funktioniert in GCC zum Booten)
Die Golfversion
Eine etwas weniger golfene Version:
quelle
R[z]=x
inP(x)
mit(R[z]=x)
. 2. GCC benötigt keine der include-Anweisungen. 3.char C
->U C
.Groovy 582
ungolfed version:
Ich denke, es gibt einen Fehler mit den Kommentaren, die nicht richtig erkannt werden, der möglicherweise durch die dumme Regex verursacht wird, die ich verwendet habe, aber die 2 Programme laufen wie sie sollten:
quelle
Haskell: eine gottlose Menge von Charakteren
In Ordnung, im Moment ist dies etwas, das vielleicht in Kürze golfen wird oder nicht. Es ist furchtbar groß für das, was es ist, mit vielen, vielen schlampig geschriebenen Codes (es ist einige Zeit her, seit ich Haskell das letzte Mal berührt habe). Aber es hat Spaß gemacht zu schreiben.
quelle
Haskell, 584
Das Eingabe- und Überbrückungsprogramm werden als die ersten beiden Eingabezeilen von stdin bereitgestellt.
Ich werde später eine ungolfed Version posten, aber in der Zwischenzeit wollte ich dies als Rätsel für den Leser belassen:
Habe Spaß!
quelle