Le célèbre webcomic Homestuck utilise un langage de programmation appelé ~ATH
à détruire les univers. Bien que ce défi de golf de code ne soit pas d'écrire un programme pour anéantir notre existence, nous allons détruire des entités plus apprivoisées (bien que moins intéressantes): les variables .
~ATH
(prononcé "jusqu'à la mort", remarquez comment ~ath
est "tilde ath") fonctionne en créant une variable appelée THIS
, en exécutant une commande avec EXECUTE
et en terminant le programme avec THIS.DIE()
. Une page wiki pour l'utilisation de la langue dans Homestuck peut être trouvée ici . L'objectif de ce défi sera de créer un ~ATH
interprète.
Pour relever le défi, je vais créer des détails ~ATH
qui n'existent pas vraiment mais les rendre (quelque peu) utiles.
- Le langage ne fonctionnera qu'avec des entiers, qui sont déclarés avec
import <variable name>;
. La variable sera automatiquement définie sur une valeur de 0. Une seule variable à la fois peut être importée. - Une variable
x
peut être copiée en écriturebifurcate x[y,z];
, ce qui supprimera la variablex
et la remplacera par des variables identiquesy
etz
. Notez qu'il ne peut pas créer une variable avec le même nom que celui supprimé. Essentiellement, une variable est renommée, puis une copie de la variable avec un nom différent est créée. Cela semble être une caractéristique stupide, mais la bêtise est très profondément ancrée dans Homestuck. - La syntaxe pour écrire un programme qui exécute du code
x
est~ATH(x){EXECUTE(<code>)}
. Si vous voulez exécuter du code sur deux variables simultanément, le code devient imbriqué, comme ceci:~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Toutes les commandes de<code>
seront exécutées surx
ety
. - Passons maintenant aux commandes.
+
incrémente les variables pertinentes de 1 et les-
diminue de 1. Et ... c'est tout. - La dernière caractéristique
~ATH
est qu'il tue tout ce avec quoi il fonctionne. Les variables sont imprimées au format<name>=<value>
(suivi d'une nouvelle ligne) à la commande[<name>].DIE();
. Ensuite, le programme imprime le motDIE <name>
et une nouvelle ligne un nombre de fois égal à la valeur absolue de la valeur de la variable. Lorsque des variables sont supprimées simultanément avec[<name1>,<name2>].DIE();
(vous pouvez supprimer autant de variables que vous le souhaitez, tant qu'elles existent), laDIE()
commande est exécutée de manière séquentielle sur les variables.
Exemples de programmes
Programme 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
Production:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Programme 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
Production:
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
C'est du golf de code, donc les règles standard s'appliquent. Le code le plus court en octets gagne.
~ATH
utilise comme virgules fins de ligne pour le import
, bifurcate
et les DIE
commandes. REPL et les fichiers sont corrects. La sensibilité à la casse est requise à la fois en entrée et en sortie (j'essaie de faire correspondre le ~ATH
plus possible le réel ).