O popular webestic Homestuck utiliza uma linguagem de programação chamada ~ATHpara destruir universos. Embora esse desafio do código de golfe não seja escrever um programa para aniquilar nossa existência, estaremos destruindo algumas entidades mais dóceis (embora menos interessantes): variáveis .
~ATH(pronunciado "até a morte", observe como o ~ath"til ath") funciona criando uma variável chamada THIS, executando um comando EXECUTEe finalizando o programa THIS.DIE(). Uma página wiki para o uso do idioma no Homestuck pode ser encontrada aqui . O objetivo deste desafio será criar um ~ATHintérprete.
Para o bem do desafio, vou criar alguns detalhes ~ATHque realmente não existem, mas torná-lo (um pouco) útil.
- O idioma funcionará apenas com números inteiros, que são declarados com
import <variable name>;. A variável será automaticamente definida como um valor 0. Somente uma variável por vez pode ser importada. - Uma variável
xpode ser copiada escrevendobifurcate x[y,z];, que excluirá a variávelxe a substituirá por variáveis idênticasyez. Observe que ela não pode criar uma variável com o mesmo nome que a excluída. Essencialmente, uma variável é renomeada e, em seguida, uma cópia da variável com um nome diferente é criada. Esta parece ser uma característica estúpida, mas a estupidez é muito profundamente enraizada na Homestuck. - A sintaxe para escrever um programa que executa o código
xé~ATH(x){EXECUTE(<code>)}. Se você quiser executar o código de duas variáveis simultaneamente, o código fica aninhada, como este:~ATH(x){~ATH(y){EXECUTE(<code>)}}. Todos os comandos<code>serão executados em ambosxey. - Agora vamos para os comandos.
+incrementa a (s) variável (s) relevante (s) em 1 e a-diminui em 1. E ... é isso. - O recurso final
~ATHé que ele mata o que quer que funcione. As variáveis são impressas no formato<name>=<value>(seguido por uma nova linha) no comando[<name>].DIE();. Posteriormente, o programa imprime a palavraDIE <name>e uma nova linha várias vezes igual ao valor absoluto do valor da variável. Quando variáveis são eliminadas simultaneamente com[<name1>,<name2>].DIE();(você pode ter quantas variáveis quiser, contanto que elas existam), oDIE()comando é executado nas variáveis sequencialmente.
Programas de exemplo
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
Resultado:
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
Resultado:
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
Isso é código de golfe, portanto, regras padrão se aplicam. O código mais curto em bytes vence.
~ATHusa ponto e vírgula como as quebras de linha para o import, bifurcatee DIEcomandos. O REPL e os arquivos estão bem. A distinção entre maiúsculas e minúsculas é necessária na entrada e na saída (estou tentando corresponder ao ~ATHmáximo possível).