Il popolare webcomic Homestuck fa uso di un linguaggio di programmazione chiamato ~ATH
a distruggere gli universi. Mentre questa sfida al golf del codice non è quella di scrivere un programma per annientare la nostra esistenza, distruggeremo alcune entità più mansuete (anche se meno interessanti): le variabili .
~ATH
(pronunciato "fino alla morte", nota come funziona ~ath
"tilde ath") creando una variabile chiamata THIS
, eseguendo un comando con EXECUTE
e terminando il programma con THIS.DIE()
. Una pagina wiki per l'uso della lingua in Homestuck è disponibile qui . L'obiettivo di questa sfida sarà quello di creare un ~ATH
interprete.
Per il bene della sfida, creerò alcuni dettagli ~ATH
che in realtà non esistono ma che renderanno (in qualche modo) utili.
- La lingua funzionerà solo con numeri interi, che sono dichiarati con
import <variable name>;
. La variabile verrà automaticamente impostata su un valore pari a 0. È possibile importare solo una variabile alla volta. - Una variabile
x
può essere copiata scrivendobifurcate x[y,z];
, che eliminerà la variabilex
e la sostituirà con variabili identichey
ez
. Si noti che non è possibile creare una variabile con lo stesso nome di quella eliminata. In sostanza, viene rinominata una variabile, quindi viene creata una copia della variabile con un nome diverso. Questo mi sembra una caratteristica stupido, ma la stupidità è molto profondamente radicato in Homestuck. - La sintassi per la scrittura di un programma che esegue il codice
x
è~ATH(x){EXECUTE(<code>)}
. Se si desidera eseguire codice da due variabili contemporaneamente, il codice diventa nidificato, in questo modo:~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Tutti i comandi in<code>
verranno eseguiti su entrambix
ey
. - Ora passiamo ai comandi.
+
incrementa le variabili rilevanti di 1 e le-
diminuisce di 1. E ... questo è tutto. - La caratteristica finale di
~ATH
è che uccide qualunque cosa funzioni. Le variabili sono stampate nel formato<name>=<value>
(seguito da una nuova riga) al comando[<name>].DIE();
. Successivamente, il programma stampa la parolaDIE <name>
e una nuova riga un numero di volte uguale al valore assoluto del valore della variabile. Quando le variabili vengono uccise contemporaneamente[<name1>,<name2>].DIE();
(è possibile avere tutte le variabili uccise che si desidera, purché esistano), ilDIE()
comando viene eseguito in sequenza sulle variabili.
Programmi di esempio
Programma 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
Produzione:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Programma 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
Produzione:
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
Questo è il golf del codice, quindi si applicano le regole standard. Vince il codice più breve in byte.
~ATH
utilizza virgola come terminatore per la import
, bifurcate
e DIE
comandi. Sia REPL che i file vanno bene. La distinzione tra maiuscole e minuscole è richiesta sia in ingresso che in uscita (sto cercando di abbinare il ~ATH
più possibile l'effettivo ).