99 (ausgesprochen "neunundneunzig") ist eine brandneue esoterische Programmiersprache (nicht zu verwechseln mit 99 , beachten Sie die Kursivschrift). Deine Aufgabe bei dieser Herausforderung ist es, einen Dolmetscher für 99 zu schreiben , der so kurz wie möglich ist. Die Einsendung mit den wenigsten Bytes gewinnt. Tiebreaker geht zu dem Beitrag, der zuerst veröffentlicht wurde.
Da diese Frage etwas ausführlicher ist als üblich und ich auf gute Antworten gespannt bin, werde ich meiner Lieblingsantwort eine Prämie von 250 Wiederholungen gewähren (nicht unbedingt der Gewinner).
99 spez
99 ist eine imperative Sprache. Jede Zeile in einem 99- Programm ist eine einzelne Anweisung , und während der Ausführung beginnt der Befehlszeiger in der obersten Zeile und durchläuft die nachfolgenden Zeilen nacheinander, wobei er sie auf dem Weg ausführt. Das Programm endet, wenn die letzte Zeile ausgeführt wurde. Goto- Anweisungen können den Pfad des Befehlszeigers umleiten.
Zeilenumbruch, Leerzeichen und 9
sind die einzigen drei Zeichen, die in einem 99- Programm eine Rolle spielen . Alle anderen Zeichen werden vollständig ignoriert. Darüber hinaus werden nachfolgende Leerzeichen in jeder Zeile ignoriert und mehrere Leerzeichen in einer Zeile werden als ein Leerzeichen gelesen. ("Newline" bezieht sich auf alle gängigen Zeilenumbruchkodierungen . Es spielt keine Rolle, welchen Ihr Interpreter verwendet.)
Also dieses Programm:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Ist identisch mit diesem Programm:
9 99 9999
9 9
Variablen
Variablen in 99 haben alle Namen, 9
die aneinander 9+
gereiht sind ( in Regex). Beispielsweise sind 9
, 99
und 9999999999
alle unterschiedliche Variablen. Natürlich gibt es unendlich viele (außer Speicherbeschränkungen).
Der Wert jeder Variablen ist eine vorzeichenbehaftete Ganzzahl mit beliebiger Genauigkeit . Standardmäßig ist jede Variable einer eigenen numerischen Darstellung zugeordnet. Sofern es nicht neu zugewiesen wurde, ist der Wert der Variablen 9
die Zahl 9 und der Wert der Variablen 99
die Zahl 99 und so weiter. Sie können sich vorstellen, dass die Variablen als reine Zahlen behandelt werden, bis sie explizit zugewiesen werden.
Ich werde V
unten auf einen beliebigen Variablennamen verweisen.
Jede Instanz V
könnte ersetzt werden 9
, 99
, 999
, 9999
etc.
Aussagen
Es gibt fünf verschiedene Anweisungstypen in 99 . Jede Zeile in einem 99- Programm enthält genau eine Anweisung.
Bei der hier beschriebenen Syntax wird davon ausgegangen, dass alle überflüssigen Zeichen entfernt wurden, alle nachgestellten Leerzeichen entfernt wurden und alle Folgen mehrerer Leerzeichen durch einzelne Leerzeichen ersetzt wurden.
1. Keine Operation
Eine leere Zeile ist ein No-Op . Es tut nichts (außer den Befehlszeiger zu erhöhen).
2. Ausgabe
V
Eine einzelne Variable V
in einer Zeile gibt diese Variable als Standardausgabe aus.
Wenn V
es eine ungerade Zahl von 9
's ( 9
, 999
usw.) gibt, wird der ganzzahlige Wert V
geteilt durch 9 (in Dezimalzahl) ausgegeben.
Wenn V
es eine gerade Anzahl von 9
's ( 99
, 9999
usw.) gibt, wird das ASCII- Zeichen mit dem V
durch 9 geteilten Code , Mod 128, gedruckt. (Das ist (V / 9) % 128
ein Wert von 0 bis 127.)
Beispiel : Das Programm
9
9999
würde drucken 1W
. Die erste Zeile wird gedruckt, 1
weil 9/9 1 ist. Die zweite Zeile wird gedruckt, W
weil 9999/9 1111 ist und 1111 mod 128 87 ist und 87 der Zeichencode für ist W
.
Beachten Sie, dass zwischen Ausgabe-Token keine Zeilenumbrüche gedruckt werden. \n
muss für einen Zeilenumbruch explizit gedruckt werden.
3. Eingabe
V
Eine einzelne Variable V
in einer Zeile mit einem führenden Leerzeichen nimmt die Eingabe von stdin entgegen und speichert sie in dieser Variablen.
Wenn V
es eine ungerade Anzahl von 9
's gibt, kann der Benutzer eine beliebige vorzeichenbehaftete Ganzzahl eingeben und V
wird auf das 9-fache dieses Werts gesetzt.
Wenn V
es eine gerade Anzahl von 9
's gibt, kann der Benutzer ein beliebiges ASCII- V
Zeichen eingeben und wird auf das 9-fache seines Zeichencodes gesetzt.
Beispiel : Gegeben -57
und A
als Eingabe dieses Programm
9
9
99
99
würde ausgeben -57A
. Intern hätte die Variable 9
den Wert -513 und 99
den Wert 585.
Ihr Interpreter kann davon ausgehen, dass die Eingaben immer syntaktisch gültig sind.
4. Abtretung
Diese Aussage kann beliebig lang sein. Es sind zwei oder mehr Variablen in einer Zeile, die durch Leerzeichen getrennt sind:
V1 V2 V3 V4 V5 ...
Dies wird der Summe aller Indizes mit geraden Indizes abzüglich der Summe der Indizes mit ungeraden Indizes (ausgenommen ) zugewiesen . Zuweisungen sind nach Wert und nicht nach Referenz.V1
V
V
V1
Es könnte in die meisten Sprachen übersetzt werden als .V1 = V2 - V3 + V4 - V5 + ...
Wenn es also nur zwei Variablen gibt, ist dies eine normale Zuweisung:
V1 V2
→ V1 = V2
Wenn es drei gibt, dann ist es Subtraktion:
V1 V2 V3
→ V1 = V2 - V3
Und das +
/ -
-Zeichen wechselt mit jeder weiteren Variablen hin und her:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Beispiel : Dieses Programm würde Folgendes ausgeben 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Springen (springe wenn alles Null ist)
Diese Aussage kann auch beliebig lang sein. Es sind zwei oder mehr Variablen in einer durch Leerzeichen getrennten Zeile mit einem führenden Leerzeichen :
V1 V2 V3 V4 V5 ...
Wenn einige der Werte ungleich Null sind, verhält sich dies wie ein No-Op. Der Anweisungszeiger wird wie gewohnt in die nächste Zeile verschoben.V1
Wenn alle der Werte außer sind Null, dann wird der Befehlszeiger bewegt Nummer Zeile . Die Zeilen sind mit einem Index von Null versehen. Wenn also Null ist, bewegt sich der Zeiger zur obersten Zeile. Das Programm wird (normalerweise ohne Fehler) beendet, wenn es negativ oder größer als der höchstmögliche Index ist (Anzahl der Zeilen minus eins).V1
V1
V1
V1
Beachten Sie, dass hier nicht durch 9 geteilt wurde. Und da es unmöglich ist, eine Variable als Wert zu definieren, der kein Vielfaches von 9 ist, kann nur zu Zeilennummern gesprungen werden, die ein Vielfaches von 9 sind.V1
Beispiele:
Dieses Programm wird für immer drucken 1
:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Dieses Programm
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
gibt die Zahlen 11 bis 1 in absteigender Reihenfolge aus, umgeben von G
:
G11G10G9G8G7G6G5G4G3G2G1G
Zusätzliche Details
Der ideale Interpreter wird von der Befehlszeile aus mit dem Namen der 99- Programmdatei als Argument ausgeführt. Die E / A-Vorgänge werden auch direkt in der Befehlszeile ausgeführt.
Sie können jedoch einfach eine Interpreterfunktion schreiben, die das Programm als Zeichenfolge sowie eine Liste der Eingabe-Token (z ["-57", "A"]
. B. ) aufnimmt . Die Funktion sollte die Ausgabezeichenfolge drucken oder zurückgeben.
Etwas andere Methoden zum Ausführen des Interpreters und zum Behandeln von E / A sind in Ordnung, wenn diese Optionen in Ihrer Sprache nicht möglich sind.
Bonus: Schreibe etwas Cooles in 99 und ich werde es gerne in diesen Beitrag als Beispiel setzen.
- Hier ist ein Pastebin eines ordentlichen "99 Bottles of Beer" -Programms aus Macs Antwort .
Hoffe, du hast meine 99. Herausforderung genossen ! : D