@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
Ele funciona apenas para valores abaixo de 256, pois o Marbelous é uma linguagem de 8 bits.
Como funciona
Marbelous é uma linguagem 2D com valores representados por bolinhas de 8 bits que caem uma célula em cada tick, a menos que algum dispositivo impeça a queda. Este programa Marbelous consiste em 3 placas; vamos começar com o mais fácil:
:O
}0
+Z
+C
{0
:Oé o nome do painel (para ser mais preciso, O é o nome e: diz ao interpretado que esta linha é um nome. Ao dar um nome aos painéis, outros painéis podem chamá-los
}0como um dispositivo de entrada, isso pode ser visto como um Esta célula será substituída por um mármore de entrada (valor) quando a função for chamada.
+Zadiciona 35 a qualquer mármore que passa por ele e o deixa cair. +Cfaz o mesmo, mas adiciona 12. {0é uma célula de saída , quando um mármore atingir essa célula, a função sairá e retornará o valor nesse dispositivo de saída.
Portanto, todos juntos, este quadro assume um valor e, em seguida, acrescenta 47. Para nós, isso significa que transforma qualquer número de dígito único no código ASCII do dígito -1 (é claro que isso também funcionará para 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Este fórum está um pouco mais complicado. Você deve conseguir identificar :Icomo o nome da placa e localizar alguns dispositivos de entrada e saída. Você notará que temos dois dispositivos de entrada diferentes }0e }1. Isso significa que esta função recebe 2 entradas. Você também notará que existem duas instâncias do }1dispositivo. Ao chamar a função, essas duas células conterão o mesmo valor. O }0dispositivo de entrada está diretamente acima de um \/dispositivo, atua como uma lata de lixo e remove qualquer mármore que cair sobre ela imediatamente.
Vamos dar uma olhada no que acontece com uma das bolinhas colocadas no quadro pelos }1dispositivos de entrada:
}1
=9 &1
&0
{>
Ele cairá no primeiro tique e atingirá o =9dispositivo. Isso compara o valor do mármore a 9 e permite que o mármore caia, se a instrução =9avaliar. O mármore é empurrado para a direita, se não. &0e &1são sincronizadores. Eles seguram bolas de gude que caem sobre eles até que todos os outros &nsincronizadores sejam preenchidos também. Como você pode esperar, isso provocará condicionalmente comportamentos diferentes em alguma outra parte do quadro.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Se eu lhe disser que ++é um incrementador, você já deverá saber com o que os diferentes sincronizadores serão preenchidos. A esquerda &1conterá o valor de entrada }1+ 1, o &0próximo a ele conterá 0 ( 00é um literal de idioma, representado em hexadecimal). O segundo &1conterá o valor 1 e o direito &0será preenchido com um F7, que subtrai 9 de um valor, uma vez que a adição no Marbelous é o módulo 256.
// é um dispositivo defletor, que empurra qualquer mármore para a esquerda em vez de deixá-lo cair.
Juntar tudo isso dá a você o seguinte: se o mármore }1for 9, os &0sincronizadores serão preenchidos. Isso fará com que o valor 0 caia na {0saída e F7(ou -9) na {1saída. Se }1não for 9, {0será preenchido com }1+ 1 e {0conterá 1. Há também um {>dispositivo, esta é uma saída especial que gera uma bola de gude próxima a uma placa em vez de embaixo dela. Isso será preenchido }1se for igual a 9.
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Ok, agora para o grande. Este quadro não tem um nome explícito, pois é o quadro principal do arquivo. Seu nome implícito é Mb. Você deve conseguir reconhecer algumas células. Há um dispositivo de entrada, alguns literais de idioma ( 00e FF). Existem alguns sincronizadores e há um defletor. vamos percorrer este pedaço por pedaço.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Portanto, o valor de entrada (a entrada da linha de comando, pois essa é a placa principal) começa na segunda célula a partir do topo, onde }0está localizado. Ele cairá e alcançará o >0dispositivo, que é outro dispositivo de comparação. qualquer mármore maior que 0 cai, qualquer outro mármore é empurrado para a direita. (como as variáveis Marbelous não são assinadas, apenas exatamente 0 será empurrado para a direita). Esse mármore de valor zero atingirá o @6dispositivo. Este é um portal e transporta o mármore para outro portal correspondente, neste caso, logo acima dele. O mármore 0 alcançará o &0sincronizador e acionará algumas coisas em outro lugar.
Se o mármore não for 0, ele cai, é desviado para a direita por \\acertos --que o diminuem em um e depois caem em /\um clonador. Este dispositivo pega uma bola de gude e produz uma cópia para a direita e outra para a esquerda. A esquerda será levada para o outro, @0onde o mármore passará pela mesma sequência novamente. A esquerda será levada para outro lugar. Isso nos dá um loop, que diminui a entrada da linha de comando uma vez por loop e aciona algum comportamento em cada loop até atingir 0. Ele então aciona outro comportamento.
Vamos dar uma olhada no que acontece com o mármore colocado em @4cada loop.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Existem três literais de idioma aqui ( FF), que caem imediatamente em portais. Esses portais os levarão para três dos IIdispositivos. IIrefere-se ao quadro :Ique definimos mais adiante no arquivo. Como :Ipossui 2 dispositivos de entrada distintos, sua representação em outra placa deve ter 2 células de largura. Como temos 6 células contendo II, podemos dizer que temos 3 instâncias dessa função no quadro.
Os FFmármores (ou 256 ou -1, se desejar) ficarão nas células de entrada da :Ifunção, esperando até que haja mármore de entrada suficiente para iniciar a função (mais um). É aí que o @4portal entra. Uma cópia da entrada da linha de comando decrementada cai em cada loop. Isso acionará a :Iplaca mais à esquerda . Inicialmente com os valores 256 (ou -1) e qualquer que seja a entrada da linha de comando foi -1. O mármore esquerdo será colocado nos }0dispositivos do :Itabuleiro e o direito no }1. Se você se lembrar do que este fórum fez, poderá saber qual é o resultado. Ele produzirá uma versão incrementada da entrada direita na saída esquerda (e transforma um 9 em 0, e não 10) e gera 1 ou -9 à direita.
O valor incrementado será levado de volta para a célula de entrada correta por um portal e o valor à direita cai em um sincronizador. Se um sincronizador já estiver segurando uma bola de gude, as duas bolas de gude colidem. Os mármores em colisão são adicionados no módulo 256. Portanto, os valores nos sincronizadores farão o seguinte: eles começam vazios, depois passam para 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 e depois para 1 novamente (desde 247 é adicionado o módulo 256).
Você também deve se lembrar que uma bola de gude obtém a saída para a direita quando o valor de entrada volta para 0. Como as :Iplacas estão próximas umas das outras, isso ativará a placa à direita uma vez. Isso preencherá os três sincronizadores com valores que são um mais altos do que deveriam ser uma representação abreviada da entrada da linha de comando, no momento em que esse loop for reduzido a 0.
Você também deve se lembrar que a :Ofunção transforma um valor no valor ascii do dígito que representa o valor -1. A saída dessas OOcélulas cairá da placa, que imprime seus caracteres ASCII correspondentes em STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Então, o que acontece quando a linha de comando de mármore atinge 0 e preenche esses &0sincronizadores? bem, algumas bolinhas de valor 0 caem e acionam os três sincronizadores que estão segurando os dígitos (+ 1) do número shortlex na parte inferior do quadro. &3é acionado primeiro, pois contém o dígito mais significativo, depois é &2seguido por &1. Esse mármore é teleportado para o outro @5dispositivo antes de atingir a !!célula, que termina o tabuleiro.
19, 20, 21, 22em decimais é mapeada para08, 09, 10, 11em shortlex. Por isso eu confundi isso100 -> 89!