E in particolare la seconda legge : l'entropia di un sistema isolato aumenta nel tempo .
Per questa sfida,
- Un " sistema isolato " sarà considerato un programma o una funzione (d'ora in poi abbreviato in "programma");
- Il passare del " tempo " corrisponderà alle esecuzioni ripetute dell'output del programma , considerato come un nuovo programma;
- L '" entropia " sarà considerata come l'entropia del primo ordine di Shannon (da definire in seguito), che è una misura della diversità dei caratteri della stringa.
La sfida
Il tuo programma dovrebbe produrre una stringa non vuota che quando eseguita come un programma nella stessa lingua produce una stringa con più entropia della precedente. L'iterazione infinita di questo processo di esecuzione in uscita deve produrre una sequenza strettamente crescente di valori di entropia .
Le stringhe possono contenere qualsiasi carattere Unicode 9.0 . La sequenza di stringhe deve essere deterministica (al contrario di casuale).
L' entropia per una determinata stringa verrà definita come segue. Identifica i suoi caratteri univoci e il loro numero di occorrenze nella stringa. La frequenza p i della i carattere unico -esimo è il numero di occorrenze di tale carattere diviso per la lunghezza della stringa. L'entropia è quindi
dove la somma è sopra tutti i caratteri univoci della stringa. Tecnicamente, questo corrisponde all'entropia di una variabile casuale discreta con distribuzione data dalle frequenze osservate nella stringa.
Lascia che H k denoti l'entropia della stringa prodotta dal programma k -th e che H 0 denoti l'entropia del codice del programma iniziale. Inoltre, lascia che L 0 indichi la lunghezza del programma iniziale in caratteri. La sequenza { H k } è monotona secondo i requisiti della sfida ed è limitata (perché il numero di caratteri esistenti è finito). Pertanto ha un limite, H ∞ .
Il punteggio di un invio sarà ( H ∞ - H 0 ) / L 0 :
- Il numeratore, H ∞ - H 0 , riflette in che misura il tuo codice "obbedisce" alla legge di aumentare l'entropia in un arco di tempo infinito.
- Il denonimatore, L 0 , è la lunghezza del codice iniziale in caratteri (non in byte).
Vince il codice con il punteggio più alto . I legami saranno risolti a favore della prima presentazione / modifica.
Per calcolare l'entropia di una stringa, puoi usare lo snippet JavaScript (per gentile concessione di @flawr e con correzioni di @Dennis e @ETHproductions ) alla fine di questo post.
Se ottenere il limite H ∞ è difficile nel tuo caso specifico, puoi usare qualsiasi limite inferiore, ad esempio H 20 , per calcolare il punteggio (in modo da usare ( H 20 - H 0 ) / L 0 ). Ma in ogni caso, la sequenza infinita di entropie deve essere strettamente crescente.
Per favore, includi una spiegazione o una breve prova che la sequenza di entropie sta aumentando, se non è evidente.
Esempio
In un linguaggio fittizio, considera il codice aabcab
, che quando viene eseguito produce la stringa cdefgh
, che quando viene eseguito produce cdefghi
, che ...
I caratteri unici del codice originale sono a
, b
e c
, con rispettive frequenze di 3/6, 2/6 e 1/6. La sua entropia è 1.4591. Questo è H 0 .
La stringa cdefgh
ha più entropia di aabcab
. Possiamo saperlo senza calcolarlo perché per un dato numero di caratteri l'entropia è massimizzata quando tutte le frequenze sono uguali. In effetti, l'entropia H 1 è 2.5850.
La stringa cdefghi
ha di nuovo più entropia della precedente. Ora possiamo senza calcolo perché l'aggiunta di un carattere inesistente aumenta sempre l'entropia. In effetti, H 2 è 2.8074.
Se la stringa successiva fosse 42
la catena non sarebbe valida, poiché H 3 sarebbe 1, inferiore a 2.8074.
Se, d'altra parte, la sequenza continuasse a produrre stringhe di entropia crescente con limite H ∞ = 3, il punteggio sarebbe (3 -1,4597) / 6 = 0,2567.
Ringraziamenti
Grazie a
@xnor per il suo aiuto nel migliorare la sfida, e in particolare per avermi convinto che infinite catene di entropia crescente ottenute dall'esecuzione ripetuta sono effettivamente possibili;
@flawr per numerosi suggerimenti, tra cui la modifica della funzione di punteggio e per la scrittura del frammento molto utile;
@Angs per evidenziare un inconveniente essenziale in una precedente definizione della funzione score;
@Dennis per una correzione nello snippet JavaScript;
@ETHproductions per un'altra correzione nello snippet;
@PeterTaylor per una correzione nella definizione di entropia.