}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous é uma linguagem de 8 bits com valores representados apenas por bolas de gude em uma máquina semelhante ao Rube Goldberg, portanto, isso não foi muito fácil. Essa abordagem é aproximadamente equivalente ao seguinte pseudocódigo:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
como o valor máximo é 256, (representado por 0 no programa Marbleous, que é tratado de maneira diferente em lugares diferentes), recursiveFunction (1) será chamado de um total 256!*512^256
igual a 10^1200
, fácil o suficiente para sobreviver ao universo.
O Marbelous não tem um intérprete muito rápido, parece que pode executar 10^11
chamadas dessa função por ano, o que significa que estamos olhando para um tempo de execução de 10^1189
anos.
Mais explicações sobre o conselho da Marbelous
00@0
--/\=0
\\@0&0
00
é um literal de linguagem (ou mármore), representado em hexadecimal (então 0). Esse mármore cai sobre o --
, que diminui qualquer mármore em 1 (00 envolve e se transforma em FF ou 255 em decimal). O Marble agora com o valor FF cai sobre o \\
que empurra uma coluna para a direita, para a inferior @0
. Este é um portal e teleporta o mármore para o outro @0
dispositivo. Lá, o mármore pousa no /\
dispositivo, que é um duplicador, coloca uma cópia do mármore --
à sua esquerda (este mármore continuará girando entre os portais e será diminuído a cada ciclo) e um =0
à sua direita.=0
compara o mármore com o valor zero e deixa o mármore cair se for igual e empurra para a direita, se não for. Se o mármore tem o valor 0, ele cai em &0
um sincronizador, que explicarei mais adiante.
Em suma, isso apenas começa com um valor de 0 em um loop e o diminui até atingir 0 novamente, depois coloca esse valor em um sincronizador e continua em loop ao mesmo tempo.
}0@1
&0/\>0!!
--
@1
}0
é um dispositivo de entrada, inicialmente a enésima (linha 0) entrada de linha de comando ao chamar o programa é colocada em todos os }n
dispositivos. Portanto, se você chamar esse programa com a entrada de linha de comando 2, um valor de mármore 02 substituirá isso }0
. Esse mármore então cai no &0
dispositivo, outro sincronizador e os &n
sincronizadores mantêm mármores até que todos os outros correspondentes também &n
sejam arquivados. O mármore então é diminuído, teleportado e duplicado, como no loop explicado anteriormente. A cópia correta é verificada quanto à desigualdade com zero ( >0
) se não for 0, ela falha. Se for 0, é empurrado para a direita e cai !!
, o que encerra o tabuleiro.
Ok, até agora temos um loop que conta continuamente de 255 a 0 e permite que outro loop semelhante (alimentado pela entrada da linha de comando) seja executado uma vez toda vez que atingir 0. Quando esse segundo loop for executado n vezes (máximo sendo 256 ) o programa termina. Portanto, são 65536 execuções no loop. Não é o suficiente para sobreviver ao universo.
}0
--@2
@2/\=0MB
Isso deve começar a parecer familiar, a entrada é decrementada uma vez e, em seguida, esse valor circula e é copiado (observe que o mármore só é diminuído uma vez, não em todas as execuções do loop). Em seguida, é verificado se a igualdade é igual a 0 e, se não for zero, aterrissará MB
. Esta é uma função no Marbelous, todo arquivo pode conter várias placas e cada placa é uma função, todas as funções devem ser nomeadas precedendo a grade por :[name]
. Todas as funções, exceto a primeira função no arquivo, que possui um nome padrão: MB. Portanto, esse loop chama continuamente a placa principal novamente com um valor em n - 1
que n é o valor com o qual essa instância da função foi chamada.
Então porque n*512
?
Bem, o primeiro loop é executado em 4 ticks (e 256 vezes) e o segundo loop é executado n vezes antes de a placa terminar. Isso significa que o fórum corre cerca de n*4*256
ticks. O último loop (que executa a chamada da função recursiva) é compactador e é executado em 2 ticks, o que significa que ele consegue chamar os n*4*256/2 = n*512
tempos da função .
Quais são os símbolos que você não mencionou?
\/
é uma lixeira, que remove bolinhas de gude do tabuleiro, isso garante que as bolinhas descartadas não interfiram com outras bolinhas que estão dando voltas e impedem que o programa seja encerrado.
Bônus
Como as bolinhas de gude que caem na parte inferior de uma placa maravilhosa são enviadas para STDOUT, esse programa imprime uma infinidade de caracteres ASCII enquanto é executado.