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 9sind 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, 9die aneinander 9+gereiht sind ( in Regex). Beispielsweise sind 9, 99und 9999999999alle 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 9die Zahl 9 und der Wert der Variablen 99die 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 Vunten auf einen beliebigen Variablennamen verweisen.
Jede Instanz Vkönnte ersetzt werden 9, 99, 999, 9999etc.
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 Vin einer Zeile gibt diese Variable als Standardausgabe aus.
Wenn Ves eine ungerade Zahl von 9's ( 9, 999usw.) gibt, wird der ganzzahlige Wert Vgeteilt durch 9 (in Dezimalzahl) ausgegeben.
Wenn Ves eine gerade Anzahl von 9's ( 99, 9999usw.) gibt, wird das ASCII- Zeichen mit dem Vdurch 9 geteilten Code , Mod 128, gedruckt. (Das ist (V / 9) % 128ein Wert von 0 bis 127.)
Beispiel : Das Programm
9
9999
würde drucken 1W. Die erste Zeile wird gedruckt, 1weil 9/9 1 ist. Die zweite Zeile wird gedruckt, Wweil 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. \nmuss für einen Zeilenumbruch explizit gedruckt werden.
3. Eingabe
V
Eine einzelne Variable Vin einer Zeile mit einem führenden Leerzeichen nimmt die Eingabe von stdin entgegen und speichert sie in dieser Variablen.
Wenn Ves eine ungerade Anzahl von 9's gibt, kann der Benutzer eine beliebige vorzeichenbehaftete Ganzzahl eingeben und Vwird auf das 9-fache dieses Werts gesetzt.
Wenn Ves eine gerade Anzahl von 9's gibt, kann der Benutzer ein beliebiges ASCII- VZeichen eingeben und wird auf das 9-fache seines Zeichencodes gesetzt.
Beispiel : Gegeben -57und Aals Eingabe dieses Programm
9
9
99
99
würde ausgeben -57A. Intern hätte die Variable 9den Wert -513 und 99den 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.V1VVV1
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 V1V1V1
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