@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
Funziona solo per valori inferiori a 256 poiché Marbelous è un linguaggio a 8 bit.
Come funziona
Marbelous è un linguaggio 2D con valori rappresentati da biglie a 8 bit che cadono su una cella per ogni segno di spunta a meno che un dispositivo non impedisca loro di cadere. Questo programma Marbelous è composto da 3 schede; iniziamo con il più semplice:
:O
}0
+Z
+C
{0
:Oè il nome della scheda (per essere precisi, O è il nome e: dice all'interpretato che questa linea è un nome. Dando un nome alle schede, altre schede possono chiamarle
}0è un dispositivo di input, questo può essere visto come un argomento di questa funzione. Questa cella verrà sostituita da un input marmo (valore) quando viene chiamata la funzione.
+Zaggiunge 35 a qualsiasi marmo che la attraversa e la lascia cadere. +Cfa lo stesso ma aggiunge solo 12.{0 è una cella di output , quando un marmo raggiunge questa cella, la funzione uscirà e restituirà il valore in questo dispositivo di output.
Quindi tutti insieme, questa scheda prende un valore e quindi ne aggiunge 47. Per noi questo significa che trasforma qualsiasi numero di una singola cifra nel codice ASCII della cifra -1 (questo ovviamente funzionerà anche per 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Questa scheda sembra un po 'più complicata. Dovresti essere in grado di identificare :Iil nome della scheda e aver individuato alcuni dispositivi di input e output. Noterai che abbiamo due diversi dispositivi di input }0e }1. Ciò significa che questa funzione accetta 2 ingressi. Noterai anche che ci sono due istanze del }1dispositivo. Quando si chiama la funzione, entrambe queste celle conterranno lo stesso valore. Il }0dispositivo di input è direttamente sopra a\/ dispositivo, questo funge da cestino e rimuove immediatamente qualsiasi marmo che vi cade sopra.
Diamo un'occhiata a cosa succede a uno dei marmi messi nella scheda dai }1dispositivi di input:
}1
=9 &1
&0
{>
Cadrà al primo segno di spunta e colpirà il =9dispositivo. Questo confronta il valore del marmo con 9 e lascia cadere il marmo se l'istruzione =9valuta attraverso. Altrimenti il marmo viene spinto a destra. &0e &1sono sincronizzatori. Si aggrappano ai marmi che cadono su di essi fino a quando tutti gli altri &nsincronizzatori non vengono riempiti. Come ci si può aspettare, questo attiverà in modo condizionale comportamenti diversi su qualche altra parte del tabellone.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Se ti dico che ++è un incrementatore, dovresti già essere in grado di dire con cosa verranno riempiti i diversi sincronizzatori. La sinistra &1conterrà il valore di input }1+ 1, la &0prossima conterrà 0 ( 00è una lingua letterale, rappresentata in esadecimale). Il secondo &1conterrà il valore 1 e il diritto &0verrà riempito con un F7, che sottrae 9 da un valore poiché l'aggiunta in Marbelous è modulo 256.
// è un dispositivo deflettore, che spinge qualsiasi marmo a sinistra invece di farlo cadere.
Mettere tutto insieme ti dà questo: se il marmo in }1è 9, i &0sincronizzatori si riempiono. Ciò farà cadere il valore 0 {0nell'output e F7(o -9) {1nell'output. Se }1non è 9, {0sarà riempito con }1+ 1 e {0conterrà 1. C'è anche un {>dispositivo, questo è un output speciale che emette un marmo vicino a una tavola al posto di sotto di esso. Questo verrà riempito }1se è uguale 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
Bene, ora per quello grande. Questa scheda non ha un nome esplicito, poiché è la scheda principale del file. Il suo nome implicito è Mb. Dovresti essere in grado di riconoscere alcune celle. C'è un dispositivo di input, alcuni letterali di lingua ( 00e FF). Ci sono alcuni sincronizzatori e c'è un deflettore. lasciamo passare questo pezzo per pezzo.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Quindi il valore di input (l'input della riga di comando poiché questa è la scheda principale) inizia nella seconda cella dall'alto in cui }0si trova. Cadrà e raggiungerà il >0dispositivo, che è un altro dispositivo di confronto. qualsiasi marmo più grande di 0 cade, qualsiasi altro marmo viene spinto a destra. (poiché le variabili Marbelous non sono firmate, solo esattamente 0 verrà spostato a destra). Questo marmo a valore zero colpirà quindi il @6dispositivo. Questo è un portale e trasporta il marmo in un altro portale corrispondente, in questo caso proprio sopra di esso. Il marmo 0 raggiungerà quindi il &0sincronizzatore e innescherà alcune cose altrove.
Se il marmo non è 0, cade, viene deviato a destra da \\colpi --che lo diminuiscono di uno e poi cade /\, un clonatore. Questo dispositivo prende un marmo e ne emette una copia a destra e una a sinistra. Quello di sinistra verrà portato verso l'alto all'altro@0 dove il marmo passerà di nuovo attraverso la stessa sequenza. Quello di sinistra verrà portato altrove. Questo ci dà un ciclo, che decrementa l'input della riga di comando una volta per ciclo e innesca un comportamento su ogni ciclo fino a raggiungere lo 0. Quindi, innesca un altro comportamento.
Diamo un'occhiata a cosa succede con il marmo inserito in @4ogni anello.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Ci sono 3 letterali linguistici qui ( FF), che cadranno immediatamente nei portali. Questi portali li porteranno su tre dei IIdispositivi. IIsi riferisce alla scheda :Idefinita più in basso nel file. Poiché :Iha 2 dispositivi di input distinti, la sua rappresentazione su un'altra scheda deve essere larga 2 celle. Dal momento che abbiamo 6 celle contenentiII , diciamo che abbiamo 3 istanze di questa funzione sulla scheda.
I FFmarmi (o 256 o -1 se vuoi) rimarranno nelle celle di input della :Ifunzione in attesa fino a quando non ci sono abbastanza input marmo per avviare la funzione (un altro che è). È qui che @4entra in gioco il portale. Una copia dell'input della riga di comando decrementato cade lì su ogni loop. Questo attiverà la :Itavola più a sinistra . Inizialmente con i valori 256 (o -1) e qualunque sia l'input della riga di comando era -1. Il marmo sinistro verrà inserito nei }0dispositivi del :Itabellone e quello destro nel }1. Se ricordi cosa ha fatto questa tavola, sarai in grado di dire quale risultato ha avuto. Produrrà una versione incrementale dell'ingresso destro sull'uscita sinistra (e trasforma un 9 in uno 0, non 10) e produce 1 o -9 a destra.
Il valore incrementato verrà riportato alla cella di input corretta da un portale e il valore a destra verrà inserito in un sincronizzatore. Se un sincronizzatore tiene già un marmo, i due marmi si scontreranno. I marmi in collisione vengono aggiunti insieme modulo 256. Quindi i valori nei sincronizzatori faranno il folowing: iniziano vuoti, quindi si trasformano in 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 e quindi in 1 di nuovo (dal 247 viene aggiunto il modulo 256).
Potresti anche ricordare che un marmo ottiene l'output a destra quando il valore di input ritorna a 0. Poiché le :Ischede sono una accanto all'altra, ciò farà scattare la scheda a destra una volta. Ciò riempirà i tre sincronizzatori con valori uno superiore a quello che dovrebbero essere per essere una rappresentazione shortlex dell'input della riga di comando, quando questo sarà passato a 0.
Potresti anche ricordare che la :Ofunzione trasforma un valore nel valore ASCII della cifra che rappresenta il valore -1. L'output di queste OOcelle cadrà quindi dalla scheda, che stampa i loro caratteri ascii corrispondenti su STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Quindi cosa succede quando la riga di comando in input marmo raggiunge 0 e riempie i &0sincronizzatori? bene, alcuni marmi di valore 0 cadono e attivano i tre sincronizzatori che tengono le cifre (+ 1) del numero shortlex nella parte inferiore della scheda. &3viene attivato per primo, poiché contiene la cifra più significativa, quindi viene &2seguito da &1. Questo marmo viene quindi teletrasportato sull'altro @5dispositivo prima di colpire la !!cella, che termina la scheda.
19, 20, 21, 22in decimale è mappata08, 09, 10, 11in shortlex. Ecco perché l'ho confuso100 -> 89!