La complessità Kolmogorov di una stringa S è la lunghezza del programma più breve P , scritto in un linguaggio di programmazione L , la cui uscita è esattamente S .
(Sì, la vera definizione è più formale ma questo sarà sufficiente per la sfida.)
Il vostro compito in questa sfida è quello di scrivere il più breve possibile "Kolmogorov complessità solver", che è, un programma scritto in L sé che prende una stringa S e ritorna più breve P scritto in L che le uscite S .
L'approccio naive a questo è di iterare su tutti 1 programmi lunghezza, quindi tutti i 2 programmi lunghezza, tutta 3 programmi di lunghezza, e così via, che esegue ciascuna di esse e misurando la corrente sino a un programma che uscite S viene trovato. Il problema con questo approccio è che alcuni di questi programmi potrebbero non smettere mai di funzionare, il che significa che il risolutore stesso potrebbe non fermarsi mai. E a causa dell'arresto del problema non esiste un modo sicuro per evitare i programmi che non si fermano.
Una semplice, sebbene soluzione imperfetta è mettere un limite di tempo per il tempo di esecuzione di ogni del potenziale P 's. I programmi che non si fermano nel tempo possono essere passati, ma il risolutore si fermerà sicuramente (supponendo che un programma in L possa effettivamente emettere S entro il limite di tempo).
Sfida
Scrivi il tuo risolutore come un programma o una funzione che comprende tre cose:
- La stringa S .
- Un numero intero positivo T che è il limite di tempo in secondi o un intervallo di tempo più piccolo (ad esempio millisecondi).
- Una stringa Una dell'alfabeto di caratteri da usare per il potenziale P 's.
Ed emette il più breve P che contiene solo caratteri in A , viene eseguito in meno di T unità di tempo, e uscite S .
Questo è lo pseudocodice generale:
Function KolmogorovComplexitySolver(S, T, A):
Assign N to 0
Loop until function returns:
In any order, iterate over all strings of length N that only contain characters from *A*. Call the current string P:
Execute P, saving the output to O, stopping the execution if it takes longer than time T
If (P did not throw any errors) and (P did not timeout) and (O and S are identical):
Return P
Add 1 to N
Dettagli
- Si può presumere che ci sarà sempre un P realizzati con i personaggi in una che viene eseguito in tempo T che le uscite S .
- Si può presumere che l'esecuzione delle potenziali P non avrà effetti collaterali che impediscono al solutore di funzionare o funzionare correttamente (come fare confusione con la memoria allocata del solutore).
- Si può non supporre che i potenziali P s' sono privi di errori. Assicurati di includere
try
/catch
blocchi o qualsiasi altra cosa applicabile intorno alla chiamata di esecuzione. - Se ci sono più P più brevi , allora ne basterà una qualsiasi. "Shortness" è misurato in caratteri non byte.
- L'output di potenziali P è ciò che viene stampato su stdout (o l'area di output normale della tua lingua). La stringa vuota è un potenziale P .
- Idealmente, il tuo risolutore consentirà ad A di contenere qualsiasi personaggio. Un must almeno per essere in grado di contenere caratteri ASCII stampabili più tab e newline.
- L'input può provenire da args file / stdin / command line / function. L'output va su stdout o simile o può essere restituito come stringa se si scrive una funzione.
punteggio
Vince l'invio con il minor numero di byte . Tiebreaker arriva alla prima pubblicazione inviata.