O popular webestic Homestuck utiliza uma linguagem de programação chamada ~ATH
para 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 EXECUTE
e 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 ~ATH
intérprete.
Para o bem do desafio, vou criar alguns detalhes ~ATH
que 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
x
pode ser copiada escrevendobifurcate x[y,z];
, que excluirá a variávelx
e a substituirá por variáveis idênticasy
ez
. 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 ambosx
ey
. - 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.
fonte
~ATH
usa ponto e vírgula como as quebras de linha para oimport
,bifurcate
eDIE
comandos. 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~ATH
máximo possível).Respostas:
Python 2.7.6,
1244130812651253107310721071106510641063 bytesTudo bem, eu não estou quebrando nenhum registro aqui, mas esse é o menor Python, pois lemos a entrada de uma só vez de um arquivo e não sequencialmente ao longo do tempo. Tentarei resolver isso posteriormente em outro idioma (e um intérprete, não apenas um analisador). Até então, aproveite a monstruosidade repugnantemente horrível.
Nota : abre um arquivo chamado
t
no diretório de trabalho. Para abrir um argumento de linha de comando, adicioneimport sys
na parte superior do arquivo e mude't'
parasys.argv[1]
fonte
Python 2,
447475463443 bytesAcontece que compactar e codificar o programa base64 ainda salva bytes sobre a versão normal. Para comparação, aqui está o normal:
Basicamente, a solução "regexy wands of magic" que era desejada. Lê em stdin o programa inteiro como uma única sequência, substitui ~ expressões ATH por expressões Python que executam a semântica descrita e exec () é a sequência resultante.
Para ver o que está fazendo, observe o programa python ao qual o segundo programa de teste fornecido é traduzido:
É bom que
00 == 0
: PObviamente, alguns bytes podem ser salvos explorando a ambiguidade nas regras. Por exemplo, não é dito o que deve acontecer no caso de alguém tentar
DIE()
uma variável que não foiimport
editada ou que já foibifurcate
d. Meu palpite, com base na descrição, era que deveria haver um erro. Se nenhum erro for necessário, eu poderia remover adel
instrução.EDIT: Corrigido um bug que os casos de teste fornecidos não testavam. Ou seja, do jeito que era, todo
~ATH
bloco redefinia a variável para zero antes de incrementá-la. Custou-me 28 bytes para corrigir isso. Se alguém vê uma maneira melhor de substituir~ATH
blocos, eu adoraria saber.EDIT 2: Salva 12 bytes desenrolando o loop regex, tornando-os todos subns e deixando a compactação cuidar da repetição.
EDIT 3: economizou mais 20 bytes substituindo o
for
loop interno por uma multiplicação de strings.fonte
import sys,re
vez deimport sys;import re
python ~ath.py < program.~ath