Come seguito al programma di abbreviazione più breve la cui dimensione di output supera il numero di Graham e Golf un numero maggiore di TREE (3) , presento una nuova sfida.
Il numero di Loader è un numero molto grande, che è un po 'difficile da spiegare (poiché era esso stesso il risultato di un esercizio di golf con un obiettivo flessibile). C'è una definizione e una spiegazione qui , ma ai fini dell'autocontenimento, cercherò di spiegarlo più avanti in questo post.
L'algoritmo utilizzato da Ralph Loader produce uno dei più grandi numeri di qualsiasi algoritmo (calcolabile) mai scritto! In effetti, il numero di Loader è il più grande numero "calcolabile" sul Wiki di Googology. (Per numero "calcolabile", significano un numero definito in termini di calcolo.) Ciò significa che se la risposta produce un numero maggiore del numero di Loader in un modo interessante (cioè non solo il numero di Loader + 1), si può scendere in Storia di googologia! Detto questo, i programmi che producono qualcosa come il numero di Loader + 1 sono sicuramente risposte valide e contendenti a questa domanda; non aspettarti nessuna fama.
Il tuo compito è creare un programma di terminazione che produca un numero maggiore del numero di Loader. Questo è code-golf , quindi vince il programma più corto!
- Non puoi ricevere input.
- Alla fine il programma deve terminare in modo deterministico, ma si può presumere che la macchina abbia una memoria infinita.
- Puoi presumere che il tipo di numero della tua lingua possa contenere qualsiasi valore finito ma devi spiegare come funziona esattamente nella tua lingua (es: un float ha una precisione infinita?)
- Gli infiniti non sono ammessi come output.
- Underflow di un tipo di numero genera un'eccezione. Non si avvolge.
- Devi fornire una spiegazione del perché il tuo numero è così grande e una versione non modificata del tuo codice per verificare se la tua soluzione è valida (poiché non esiste un computer con memoria sufficiente per memorizzare il numero di Loader).
Quindi, ecco una spiegazione del numero di Loader. Vedi http://googology.wikia.com/wiki/Loader%27s_number e i relativi collegamenti per dettagli più precisi. In particolare, contiene un programma che produce esattamente il numero di Loader (per definizione).
Il calcolo delle costruzioni è essenzialmente un linguaggio di programmazione con proprietà molto particolari.
Prima di tutto, ogni programma sintatticamente valido termina. Non ci sono loop infiniti. Questo sarà molto utile, perché significa che se eseguiamo un programma di calcolo arbitrario delle costruzioni, il nostro programma non si bloccherà. Il problema è che ciò implica che il calcolo delle costruzioni non è completo di Turing.
In secondo luogo, tra i linguaggi completi non turing, è uno dei più potenti. In sostanza, se puoi dimostrare che una macchina di Turing si fermerà su ogni input, puoi programmare una funzione nel calcolo delle costruzioni che la simulerà. (Questo non lo rende completo, perché ci sono macchine di arresto che non si possono dimostrare che stanno arrestando.)
Il numero di Loader è essenzialmente un numero di castori occupato per il calcolo delle costruzioni, che è possibile calcolare poiché tutti i programmi coc terminano.
In particolare, loader.c definisce una funzione chiamata D
. Approssimativamente, D(x)
scorre tutte le stringhe di bit in meno x
, le interpreta come programmi coc, esegue quelli sintatticamente validi e concatena i risultati (che saranno anche stringhe di bit ). Restituisce questa concatenazione.
Il numero del caricatore è D(D(D(D(D(99)))))
.
Una copia più leggibile del codice dalla wiki di googolology
int r, a;
P(y,x){return y- ~y<<x;}
Z(x){return r = x % 2 ? 0 : 1 + Z (x / 2 );}
L(x){return x/2 >> Z(x);}
S(v,y,c,t){
int f = L(t);
int x = r;
return f-2 ? f>2 ? f-v ? t-(f>v)*c : y : P(f,P(S(v,y,c,L(x)), S(v+2,t=S(4,13,-4,y),c,Z(x)))) : A(S(v,y,c,L(x)),S(v,y,c,Z(x)));
}
A(y,x){return L(y)-1 ? 5<<P(y,x) : S(4,x,4,Z(r));}
D(x)
{
int f;
int d;
int c=0;
int t=7;
int u=14;
while(x&&D(x-1),(x/=2)%2&&(1)){
d = L(L(D(x))),
f = L(r),
x = L(r),
c - r||(L(u)||L(r)-f||(x/=2)%2&&(u=S(4,d,4, r),t=A(t,d)),f/2&(x/=2)%2&&(c=P(d,c),t=S(4,13,-4,t),u=S(4,13,-4,u))),
c&&(x/=2)%2&&(t=P(~u&2|(x/=2)%2&&(u=1<<P(L(c),u)),P(L(c),t)),c=r)
u/2&(x/=2)%2&&(c=P(t,c),u=S(4,13,-4,t),t=9);
}
return a = P( P( t, P( u, P( x, c)) ),a);
}
main(){return D(D(D(D(D(99)))));}