Das beliebte Webcomic Homestuck verwendet eine Programmiersprache, die ~ATH
dazu dient, Universen zu zerstören. Während diese Code-Golf-Herausforderung nicht darin besteht, ein Programm zu schreiben, um unsere Existenz zu vernichten, werden wir einige zahmere (wenn auch weniger interessante) Entitäten zerstören: Variablen .
~ATH
(ausgesprochen "bis zum Tod", beachten Sie, wie ~ath
"tilde ath" ist), indem Sie eine aufgerufene Variable erstellen THIS
, einen Befehl mit ausführen EXECUTE
und das Programm mit beenden THIS.DIE()
. Eine Wiki-Seite für die Verwendung der Sprache in Homestuck finden Sie hier . Ziel dieser Herausforderung ist es, einen ~ATH
Dolmetscher zu erstellen .
Um der Herausforderung willen werde ich einige Details erstellen ~ATH
, die es nicht wirklich gibt, aber die es (etwas) nützlich machen.
- Die Sprache funktioniert nur mit Ganzzahlen, die mit deklariert sind
import <variable name>;
. Die Variable wird automatisch auf den Wert 0 gesetzt. Es kann jeweils nur eine Variable importiert werden. - Eine Variable
x
kann durch Schreiben kopiert werdenbifurcate x[y,z];
, wodurch die Variable gelöschtx
und durch identische Variableny
und ersetzt wirdz
. Beachten Sie, dass keine Variable mit demselben Namen wie die gelöschte erstellt werden kann. Im Wesentlichen wird eine Variable umbenannt und anschließend eine Kopie der Variablen mit einem anderen Namen erstellt. Dies scheint ein dummer Zug zu sein, aber die Dummheit ist sehr tief verwurzelt in Homestuck . - Die Syntax zum Schreiben eines Programms, in dem Code ausgeführt wird,
x
lautet~ATH(x){EXECUTE(<code>)}
. Wenn Sie Code auf zwei Variablen gleichzeitig ausgeführt werden soll, wird der Code verschachtelt, wie folgt aus :~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Alle eingehenden Befehle<code>
werden aufx
und ausgeführty
. - Gehen wir nun zu den Befehlen über.
+
erhöht relevante Variable (n) um 1 und-
dekrementiert sie um 1. Und ... das war's. - Das letzte Merkmal von
~ATH
ist, dass es alles tötet, womit es funktioniert. Variablen werden im Format<name>=<value>
(gefolgt von einer neuen Zeile) auf Befehl gedruckt[<name>].DIE();
. Danach gibt das Programm das WortDIE <name>
und eine neue Zeile so oft aus, wie der absolute Wert des Werts der Variablen entspricht. Wenn Variablen gleichzeitig mit getötet werden[<name1>,<name2>].DIE();
(Sie können so viele Variablen töten lassen, wie Sie möchten, solange sie existieren), wird derDIE()
Befehl nacheinander für die Variablen ausgeführt.
Beispielprogramme
Programm 1:
import sollux; //calls variable "sollux"
import eridan; //calls variable "eridan"
~ATH(sollux){EXECUTE(--)} //sets the value of "sollux" to -2
~ATH(eridan){EXECUTE(+++++)} //sets the value of "eridan" to 5
[sollux].DIE(); //kills "sollux", prints "DIE sollux" twice
~ATH(eridan){EXECUTE(+)} //sets the value of "eridan" to 6
[eridan].DIE(); //kills "eridan", prints "DIE eridan" 6 times
Ausgabe:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Programm 2:
import THIS; //calls variable "THIS"
~ATH(THIS){EXECUTE(++++)} //sets the value of "THIS" to 4
bifurcate THIS[THIS1,THIS2]; //deletes "THIS", creates variables "THIS1" and "THIS2" both equal to 4
~ATH(THIS1){EXECUTE(++)} //sets the value of "THIS1" to 6
[THIS1,THIS2].DIE(); //kills "THIS1" and "THIS2", prints "DIE THIS1" 6 times then "DIE THIS2" 4 times
import THAT; //calls variable "THAT"
bifurcate THAT[THESE,THOSE]; //deletes "THAT", creates variables "THESE" and "THOSE"
~ATH(THESE){~ATH(THOSE){EXECUTE(+++)}EXECUTE(++)} //sets the value of "THESE" and "THOSE" to 3, then sets the value of "THESE" to 5
[THESE,THOSE].DIE(); //kills "THESE" and "THOSE", prints "DIE THESE" 5 times then "DIE THOSE" 3 times
Ausgabe:
THIS1=6
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
THIS2=4
DIE THIS2
DIE THIS2
DIE THIS2
DIE THIS2
THESE=5
DIE THESE
DIE THESE
DIE THESE
DIE THESE
DIE THESE
THOSE=3
DIE THOSE
DIE THOSE
DIE THOSE
Dies ist Codegolf, daher gelten die Standardregeln. Kürzester Code in Bytes gewinnt.
quelle
~ATH
verwendet Semikolons als Zeilenenden für dasimport
,bifurcate
undDIE
Befehle. Sowohl REPL als auch Dateien sind in Ordnung. Sowohl in der Eingabe als auch in der Ausgabe muss die Groß- und Kleinschreibung beachtet werden (ich versuche, die tatsächliche Schreibweise~ATH
so weit wie möglich zu berücksichtigen).Antworten:
Python 2.7.6,
1244130812651253107310721071106510641063 BytesIn Ordnung, ich brich hier keine Rekorde, aber dies ist ungefähr die kleinste Python-Methode, bei der alle Eingaben auf einmal aus einer Datei und nicht nacheinander im Laufe der Zeit gelesen werden. Ich werde später versuchen, dies in einer anderen Sprache (und einem Dolmetscher, nicht nur einem Parser) zu erläutern. Genießen Sie bis dahin die widerlich schreckliche Monstrosität.
Hinweis : Öffnet eine
t
im Arbeitsverzeichnis aufgerufene Datei . Um ein Befehlszeilenargument zu öffnen, fügen Sieimport sys
es am Anfang der Datei hinzu und ändern Sie es't'
insys.argv[1]
quelle
Python 2,
447475463443 BytesEs stellt sich heraus, dass das Zippen und Codieren des Programms base64 immer noch Bytes gegenüber der normalen Version spart. Zum Vergleich hier der normale:
Grundsätzlich war die "regexy Zauberstäbe" -Lösung erwünscht. Liest das gesamte Programm von stdin als einzelne Zeichenfolge ein, ersetzt ~ ATH-Ausdrücke durch Python-Ausdrücke, die die beschriebene Semantik ausführen, und führt () die resultierende Zeichenfolge aus.
Schauen Sie sich das Python-Programm an, in das das zweite Testprogramm übersetzt wird:
Es ist gut, dass
00 == 0
: POffensichtlich könnten einige Bytes gespart werden, indem Mehrdeutigkeiten in den Regeln ausgenutzt werden. Zum Beispiel wird nicht gesagt, was passieren soll, wenn jemand versucht,
DIE()
eine Variable zu bearbeiten, die nichtimport
oder bereitsbifurcate
bearbeitet wurde. Meine Vermutung basierend auf der Beschreibung war, dass es einen Fehler geben sollte. Wenn kein Fehler erforderlich ist, könnte ich diedel
Anweisung entfernen .BEARBEITEN: Es wurde ein Fehler behoben, auf den die bereitgestellten Testfälle nicht getestet wurden. So wie es war, setzte jeder
~ATH
Block die Variable auf Null zurück, bevor er sie inkrementierte. Es hat mich 28 Bytes gekostet, das zu reparieren. Wenn jemand eine bessere Möglichkeit zum Ersetzen von~ATH
Blöcken sieht , würde ich es gerne wissen.BEARBEITEN 2: 12 Bytes wurden eingespart, indem die Regex-Schleife aufgerollt wurde, alle Subns erstellt wurden und die Komprimierung sich um die Wiederholung kümmerte.
EDIT 3: Durch Ersetzen der inneren
for
Schleife durch eine String-Multiplikation wurden 20 weitere Bytes eingespart.quelle
import sys,re
nichtimport sys;import re
python ~ath.py < program.~ath