@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
}0
como 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.
+Z
adiciona 35 a qualquer mármore que passa por ele e o deixa cair. +C
faz 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 :I
como o nome da placa e localizar alguns dispositivos de entrada e saída. Você notará que temos dois dispositivos de entrada diferentes }0
e }1
. Isso significa que esta função recebe 2 entradas. Você também notará que existem duas instâncias do }1
dispositivo. Ao chamar a função, essas duas células conterão o mesmo valor. O }0
dispositivo 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 }1
dispositivos de entrada:
}1
=9 &1
&0
{>
Ele cairá no primeiro tique e atingirá o =9
dispositivo. Isso compara o valor do mármore a 9 e permite que o mármore caia, se a instrução =9
avaliar. O mármore é empurrado para a direita, se não. &0
e &1
são sincronizadores. Eles seguram bolas de gude que caem sobre eles até que todos os outros &n
sincronizadores 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 &1
conterá o valor de entrada }1
+ 1, o &0
próximo a ele conterá 0 ( 00
é um literal de idioma, representado em hexadecimal). O segundo &1
conterá o valor 1 e o direito &0
será 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 }1
for 9, os &0
sincronizadores serão preenchidos. Isso fará com que o valor 0 caia na {0
saída e F7
(ou -9) na {1
saída. Se }1
não for 9, {0
será preenchido com }1
+ 1 e {0
conterá 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 }1
se 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 ( 00
e 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 }0
está localizado. Ele cairá e alcançará o >0
dispositivo, 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 @6
dispositivo. Este é um portal e transporta o mármore para outro portal correspondente, neste caso, logo acima dele. O mármore 0 alcançará o &0
sincronizador 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, @0
onde 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 @4
cada 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 II
dispositivos. II
refere-se ao quadro :I
que definimos mais adiante no arquivo. Como :I
possui 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 FF
mármores (ou 256 ou -1, se desejar) ficarão nas células de entrada da :I
função, esperando até que haja mármore de entrada suficiente para iniciar a função (mais um). É aí que o @4
portal entra. Uma cópia da entrada da linha de comando decrementada cai em cada loop. Isso acionará a :I
placa 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 }0
dispositivos do :I
tabuleiro 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 :I
placas 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 :O
função transforma um valor no valor ascii do dígito que representa o valor -1. A saída dessas OO
cé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 &0
sincronizadores? 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 é &2
seguido por &1
. Esse mármore é teleportado para o outro @5
dispositivo antes de atingir a !!
célula, que termina o tabuleiro.
19, 20, 21, 22
em decimais é mapeada para08, 09, 10, 11
em shortlex. Por isso eu confundi isso100 -> 89
!