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.
fuente
~ATH
utiliza un punto y coma como el fin de línea para elimport
,bifurcate
yDIE
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).Respuestas:
Python 2.7.6,
1244130812651253107310721071106510641063 bytesMuy bien, no estoy batiendo ningún récord aquí, pero se trata de que el Python más pequeño irá en la medida en que lea la entrada de una vez desde un archivo en lugar de hacerlo secuencialmente con el tiempo. Trataré de aumentar esto más adelante en un idioma diferente (y un intérprete, no solo un analizador). Hasta entonces, disfruta de la monstruosidad asquerosamente horrible.
Nota : abre un archivo llamado
t
en el directorio de trabajo. Para que abra un argumento de línea de comando, agregueimport sys
al principio del archivo y cambie't'
asys.argv[1]
fuente
Python 2,
447475463443 bytesResulta que comprimir y codificar el programa base64 todavía guarda bytes sobre la versión normal. A modo de comparación, aquí está el normal:
Básicamente, la solución de "varitas mágicas regexy" que se deseaba. Lee en todo el programa desde stdin como una sola cadena, reemplaza las expresiones ~ ATH con expresiones de Python que hacen la semántica descrita, y exec () s la cadena resultante.
Para ver lo que está haciendo, mire el programa de Python al que se traduce el segundo programa de prueba proporcionado:
Es bueno que
00 == 0
: PObviamente, se podrían guardar algunos bytes explotando la ambigüedad en las reglas. Por ejemplo, no se dice qué debería suceder en el caso de que alguien intente con
DIE()
una variable que no ha sidoimport
editada, o que ya ha sidobifurcate
d. Mi suposición basada en la descripción fue que debería haber un error. Si no se requiere ningún error, podría eliminar ladel
declaración.EDITAR: se corrigió un error que los casos de prueba proporcionados no probaron. A saber, tal como era, cada
~ATH
bloque restablecía la variable a cero antes de incrementarla. Me costó 28 bytes arreglar eso. Si alguien ve una mejor manera de reemplazar~ATH
bloques, me encantaría saberlo.EDIT 2: ahorró 12 bytes desenrollando el ciclo regex, haciéndolos todos subns y dejando que la compresión se encargue de la repetición.
EDIT 3: ahorró 20 bytes más al reemplazar el
for
bucle interno con una multiplicación de cadena.fuente
import sys,re
lugar deimport sys;import re
python ~ath.py < program.~ath