Newline aggiunti per chiarezza:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Mi sono dato la restrizione che deve leggere da STDIN piuttosto che dall'alto dello stack come farebbe normalmente una risposta di sottocarico. Ho anche usato un input decimale corretto, che costituisce la maggior parte del codice.
Spiegazione:
Avvolgo il programma in un involucro di quine: (a(:^)*
e ):^
. Ciò significa che tutto il codice all'interno del wrapper quine avrà il codice sorgente del programma nella parte inferiore dello stack.
Per convertire le cifre in un normale numero della Chiesa, utilizzo la tecnica di sostituzione di ogni cifra con il codice per moltiplicare per 10 e aggiungere quella cifra:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
C'è molta ripetizione qui, quindi impacchettiamolo in un sottoprogramma che prenderà un numero Church dalla cima dello stack e lo useremo per costruire la "stringa di cifre:"
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Ho inserito questo in un nuovo ambiente in modo che sia possibile accedervi rapidamente:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Ora posso creare il codice di sostituzione per R
. R
utilizza gli elementi principali dello stack per formare una tabella di ricerca per sostituire una stringa da STDIN con il codice Betaload. Funziona così:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Tuttavia, possiamo usare il sottoprogramma che abbiamo appena creato per generare i segmenti di codice:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Quando R
viene eseguito, trasformerà l'input in una serie di sottoprogrammi che costruiscono un numero di Church. Quando questo sottoprogramma viene eseguito, crea quel numero Church sull'elemento successivo nella pila (0, che è stato posizionato in basso). Ciò significa che, dopo R^
, il valore più alto nella pila sarà il numero della Chiesa. Abbiamo quindi ancora ^
una volta di applicare il numero Church all'elemento finale nello stack (il codice sorgente del programma) per ottenere la risposta.
Curiosità: ho avuto il MD per questa presentazione per diversi mesi. L'avevo tenuto dopo aver frainteso una domanda (che non riesco più a trovare). Ho dovuto scavarlo dal mio cestino per pubblicarlo qui.