El popular webcomic Homestuck utiliza un lenguaje de programación llamado ~ATH
para destruir universos. Si bien este desafío de código de golf no es escribir un programa para aniquilar nuestra existencia, estaremos destruyendo algunas entidades más mansas (aunque menos interesantes): las variables .
~ATH
(pronunciado "hasta la muerte", observe cómo funciona ~ath
"tilde ath") creando una variable llamada THIS
, ejecutando un comando con EXECUTE
y terminando el programa con THIS.DIE()
. Aquí se puede encontrar una página wiki para el uso del idioma en Homestuck . El objetivo de este desafío será crear un ~ATH
intérprete.
En aras del desafío, voy a crear algunos detalles ~ATH
que realmente no existen, pero lo haré (algo) útil.
- El lenguaje solo funcionará con enteros, que se declaran con
import <variable name>;
. La variable se establecerá automáticamente en un valor de 0. Solo se puede importar una variable a la vez. - Se
x
puede copiar una variable escribiendobifurcate x[y,z];
, lo que eliminará la variablex
y la reemplazará con variables idénticasy
yz
. Tenga en cuenta que no puede crear una variable con el mismo nombre que la eliminada. Esencialmente, se cambia el nombre de una variable, luego se crea una copia de la variable con un nombre diferente. Esto parece como una característica estúpida, pero la estupidez está muy profundamente arraigado en Homestuck. - La sintaxis para escribir un programa que ejecuta código
x
es~ATH(x){EXECUTE(<code>)}
. Si desea ejecutar un código de dos variables al mismo tiempo, se convierte en el código anidado, como esto:~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Todos los comandos<code>
se ejecutarán en ambosx
yy
. - Ahora pasemos a los comandos.
+
incrementa las variables relevantes en 1 y las-
disminuye en 1. Y ... eso es todo. - La característica final de
~ATH
es que mata todo lo que funciona. Las variables se imprimen en el formato<name>=<value>
(seguido de una nueva línea) en el comando[<name>].DIE();
. Posteriormente, el programa imprime la palabraDIE <name>
y una nueva línea varias veces igual al valor absoluto del valor de la variable. Cuando las variables se eliminan simultáneamente con[<name1>,<name2>].DIE();
(puede tener tantas variables eliminadas como desee, siempre que existan), elDIE()
comando se ejecuta secuencialmente en las variables.
Programas de ejemplo
Programa 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
Salida:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Programa 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
Salida:
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
Este es el código de golf, por lo que se aplican reglas estándar. El código más corto en bytes gana.
~ATH
utiliza un punto y coma como el fin de línea para el import
, bifurcate
y DIE
los comandos. Tanto REPL como archivos están bien. Se requiere mayúsculas y minúsculas tanto en la entrada como en la salida (estoy tratando de igualar la real ~ATH
tanto como sea posible).