}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous è un linguaggio a 8 bit con valori rappresentati solo da biglie in una macchina simile a Rube Goldberg, quindi non è stato molto facile. Questo approccio è approssimativamente equivalente al seguente pseudo-codice:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
poiché il valore massimo è 256, (rappresentato da 0 nel programma Marbleous, che viene gestito in modo diverso in luoghi diversi) recursiveFunction (1) verrà chiamato un totale di 256!*512^256
cui equivale 10^1200
, abbastanza facilmente da sopravvivere all'universo.
Marbelous non ha un interprete molto veloce, sembra che possa eseguire 10^11
chiamate di questa funzione all'anno, il che significa che stiamo guardando un periodo di tempo di 10^1189
anni.
Ulteriore spiegazione della scheda Marbelous
00@0
--/\=0
\\@0&0
00
è un linguaggio letterale (o un marmo), rappresentato in esadecimale (quindi 0). Questo marmo cade sul --
, che diminuisce di 1 qualsiasi marmo (00 avvolge e si trasforma in FF o 255 in decimale). Il Marmo con ora il valore FF cade sulla \\
quale lo spinge una colonna a destra, in basso @0
. Questo è un portale e teletrasporta il marmo all'altro @0
dispositivo. Lì, il marmo atterra sul /\
dispositivo, che è un duplicatore, mette una copia del marmo --
alla sua sinistra (questo marmo continuerà a scorrere tra i portali e si ridurrà su ogni anello) e uno =0
alla sua destra.=0
confronta il marmo con il valore zero e lascia cadere il marmo attraverso se è uguale e lo spinge a destra in caso contrario. Se il marmo ha il valore 0, atterra su &0
un sincronizzatore, che spiegherò più avanti, più avanti.
Tutto sommato, questo inizia con un marmo di valore 0 in un ciclo e lo decrementa fino a raggiungere nuovamente 0, quindi inserisce questo marmo di valore 0 in un sincronizzatore e continua a ciclo allo stesso tempo.
}0@1
&0/\>0!!
--
@1
}0
è un dispositivo di input, inizialmente l'ennesimo input (base 0) della riga di comando quando si chiama il programma viene inserito in ogni }n
dispositivo. Quindi se si chiama questo programma con l'ingresso della riga di comando 2, un valore di marmo 02 sostituirà questo }0
. Questo marmo quindi cade nel &0
dispositivo, un altro sincronizzatore, i &n
sincronizzatori trattengono i marmi fino a quando non &n
vengono archiviati anche tutti gli altri corrispondenti . Il marmo viene quindi decrementato, teletrasportato e duplicato in modo molto simile al ciclo precedentemente spiegato. La copia giusta viene quindi verificata per la disuguaglianza con zero ( >0
) se non è 0, passa attraverso. Se è 0, viene spinto a destra e atterra !!
, il che termina la scheda.
Ok, finora abbiamo un loop che conta continuamente da 255 a 0 e consente a un altro loop simile (alimentato dall'input della riga di comando) di essere eseguito una volta ogni volta che colpisce 0. Quando questo secondo loop ha funzionato n volte (massimo 256 ) il programma termina. Quindi questo è un massimo di 65536 esecuzioni del ciclo. Non abbastanza per sopravvivere all'universo.
}0
--@2
@2/\=0MB
Questo dovrebbe iniziare a sembrare familiare, l'input viene decrementato una volta, quindi questo valore gira e viene copiato (nota che il marmo viene decrementato solo una volta, non ad ogni ciclo). Viene quindi verificato l'uguaglianza su 0 e se non è zero atterra MB
. Questa è una funzione in Marbelous, ogni file può contenere più schede e ogni scheda è una funzione, ogni funzione deve essere nominata precedendo la griglia :[name]
. Ogni funzione tranne la prima funzione nel file, che ha un nome standard: MB. Quindi questo loop chiama di nuovo continuamente la scheda madre con un valore in n - 1
cui n è il valore con cui è stata chiamata questa istanza della funzione.
Allora perchè n*512
?
Bene, il primo loop viene eseguito in 4 tick (e 256 volte) e il secondo loop viene eseguito n volte prima che la scheda termini. Ciò significa che la scheda funziona per circa le n*4*256
zecche. L'ultimo loop (che esegue la chiamata ricorsiva della funzione) è composto e viene eseguito in 2 tick, il che significa che riesce a chiamare i n*4*256/2 = n*512
tempi della funzione .
Quali sono i simboli che non hai menzionato?
\/
è un cestino, che rimuove i marmi dalla scheda, questo fa sì che i marmi scartati non interferiscano con altri marmi che si ripetono in un round e impediscono al programma di terminare.
indennità
Poiché i marmi che cadono dalla parte inferiore di una tavola marbel vengono inviati a STDOUT, questo programma stampa una pletora di caratteri ASCII mentre è in esecuzione.