}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous es un lenguaje de 8 bits con valores solo representados por canicas en una máquina similar a Rube Goldberg, por lo que esto no fue muy fácil. Este enfoque es más o menos equivalente al siguiente pseudocódigo:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
dado que el valor máximo es 256, (representado por 0 en el programa Marbleous, que se maneja de manera diferente en diferentes lugares) recursiveFunction (1) se llamará un total de lo 256!*512^256
cual es igual 10^1200
, lo suficientemente fácil como para sobrevivir al universo.
Marbelous no tiene un intérprete muy rápido, parece que puede ejecutar 10^11
llamadas de esta función por año, lo que significa que estamos viendo un tiempo de ejecución de 10^1189
años.
Explicación adicional de la placa Marbelous
00@0
--/\=0
\\@0&0
00
es un lenguaje literal (o canica), representado en hexadecimal (por lo tanto, 0). Esta canica cae sobre el --
, que disminuye cualquier canica en 1 (00 se envuelve y se convierte en FF o 255 en decimal). El mármol con ahora el valor FF cae sobre el \\
que lo empuja una columna a la derecha, hacia abajo @0
. Este es un portal y teletransporta la canica al otro @0
dispositivo. Allí, la canica aterriza en el /\
dispositivo, que es un duplicador, coloca una copia de la canica --
a su izquierda (esta canica seguirá girando entre los portales y se reducirá en cada bucle) y una a la =0
derecha.=0
compara la canica con el valor cero y deja que la canica caiga si es igual y la empuja hacia la derecha si no es así. Si la canica tiene el valor 0, aterriza en &0
un sincronizador, que explicaré más adelante, más adelante.
Con todo, esto solo comienza con una canica de valor 0 en un bucle y lo disminuye hasta que llegue a 0 nuevamente, luego coloca esta canica de valor 0 en un sincronizador y sigue haciendo bucles al mismo tiempo.
}0@1
&0/\>0!!
--
@1
}0
es un dispositivo de entrada, inicialmente la enésima entrada de línea de comando (base 0) cuando se llama al programa se coloca en cada }n
dispositivo. Entonces, si llama a este programa con la entrada de línea de comando 2, una canica de valor 02 reemplazará esto }0
. Luego, esta canica cae en el &0
dispositivo, otro sincronizador, los &n
sincronizadores retienen canicas hasta que &n
se archivan todos los demás correspondientes . Luego, la canica se disminuye, se teletransporta y se duplica como en el bucle explicado anteriormente. Luego, se verifica la desigualdad con cero ( >0
) en la copia correcta si no es 0, se cae. Si es 0, se empuja hacia la derecha y aterriza !!
, lo que termina el tablero.
Bien, hasta ahora tenemos un ciclo que cuenta regresivamente de 255 a 0 y permite que otro ciclo similar (alimentado por la entrada de la línea de comando) se ejecute una vez cada vez que llega a 0. Cuando este segundo ciclo se ha ejecutado n veces (máximo 256 ) el programa termina. Entonces eso es un máximo de 65536 carreras del bucle. No lo suficiente como para sobrevivir al universo.
}0
--@2
@2/\=0MB
Esto debería comenzar a parecer familiar, la entrada se disminuye una vez, luego este valor se repite y se copia (tenga en cuenta que la canica solo se disminuye una vez, no en cada ejecución del bucle). Luego se verifica la igualdad a 0 y si no es cero, aterriza MB
. Esta es una función en Marbelous, cada archivo puede contener varias placas y cada placa es una función, cada función debe nombrarse precediendo la cuadrícula por :[name]
. Todas las funciones, excepto la primera función del archivo, que tiene un nombre estándar: MB. Entonces, este ciclo llama continuamente a la placa principal nuevamente con un valor de n - 1
donde n es el valor con el que se llamó a esta instancia de la función.
¿Entonces por qué n*512
?
Bueno, el primer ciclo se ejecuta en 4 ticks (y 256 veces) y el segundo ciclo se ejecuta n veces antes de que finalice el tablero. Esto significa que el tablero se ejecuta durante aproximadamente n*4*256
ticks. El último bucle (que llama a la función recursiva) es compacto y se ejecuta en 2 tics, lo que significa que logra llamar a los n*4*256/2 = n*512
tiempos de la función .
¿Cuáles son los símbolos que no mencionaste?
\/
es un contenedor de basura, que elimina las canicas del tablero, esto asegura que las canicas descartadas no interfieran con otras canicas que están dando vueltas y evitan que el programa finalice.
Prima
Dado que las canicas que caen del fondo de una placa maravillosa salen a STDOUT, este programa imprime una gran cantidad de caracteres ASCII mientras se ejecuta.