Et en particulier la deuxième loi : l'entropie d'un système isolé augmente avec le temps .
Pour ce défi,
- Un " système isolé " sera considéré comme un programme ou une fonction (abrégé en "programme" à partir de maintenant);
- Le passage du « temps » correspondra à des exécutions itératives de la sortie du programme , considéré comme un nouveau programme;
- " Entropie " sera considérée comme l'entropie de premier ordre de Shannon (à définir ci-dessous), qui est une mesure de la diversité des caractères de la chaîne.
Le défi
Votre programme doit produire une chaîne non vide qui, lorsqu'elle est exécutée en tant que programme dans le même langage, produit une chaîne avec plus d'entropie que la précédente. L'itération à l'infini de ce processus d'exécution de la sortie doit produire une séquence strictement croissante de valeurs d'entropie .
Les chaînes peuvent contenir n'importe quel caractère Unicode 9.0 . La séquence de chaînes doit être déterministe (par opposition à aléatoire).
L' entropie pour une chaîne donnée sera définie comme suit. Identifiez ses caractères uniques et leur nombre d'occurrences dans la chaîne. La fréquence p i du i- ème caractère unique est le nombre d'occurrences de ce caractère divisé par la longueur de la chaîne. L'entropie est alors
où la somme est sur tous les caractères uniques de la chaîne. Techniquement, cela correspond à l' entropie d'une variable aléatoire discrète avec une distribution donnée par les fréquences observées dans la chaîne.
Soit H k l'entropie de la chaîne produite par le k- ème programme, et soit H 0 l'entropie du code du programme initial. Aussi, laissez L 0 indiquer la longueur du programme initial en caractères. La séquence { H k } est monotone selon les exigences du défi et est bornée (car le nombre de caractères existants est fini). Il a donc une limite, H ∞ .
Le score d'une soumission sera ( H ∞ - H 0 ) / L 0 :
- Le numérateur, H ∞ - H 0 , reflète dans quelle mesure votre code "obéit" à la loi d'augmentation de l'entropie sur une période de temps infinie.
- Le dénonimateur, L 0 , est la longueur du code initial en caractères (pas en octets).
Le code avec le score le plus élevé gagne . Les égalités seront résolues en faveur de la première soumission / modification.
Pour calculer l'entropie d'une chaîne, vous pouvez utiliser l'extrait de code JavaScript (gracieuseté de @flawr et avec les corrections de @Dennis et @ETHproductions ) à la fin de ce post.
Si l'obtention de la limite H ∞ est difficile dans votre cas particulier, vous pouvez utiliser n'importe quelle borne inférieure, disons H 20 , pour calculer le score (vous utiliserez donc ( H 20 - H 0 ) / L 0 ). Mais en tout cas, la séquence infinie d'entropies doit être strictement croissante.
Veuillez inclure une explication ou une courte preuve que la séquence d'entropies augmente, si ce n'est pas évident.
Exemple
Dans un langage fictif, considérons le code aabcab
, qui lors de l'exécution produit la chaîne cdefgh
, qui lors de l'exécution produit cdefghi
, qui ...
Les caractères uniques du code d'origine sont a
, b
et c
, avec les fréquences respectives 3/6, 2/6 et 1/6. Son entropie est de 1,4591. C'est H 0 .
La chaîne cdefgh
a plus d'entropie que aabcab
. On peut le savoir sans le calculer car pour un nombre donné de caractères l'entropie est maximisée lorsque toutes les fréquences sont égales. En effet, l'entropie H 1 est de 2,5850.
La chaîne a de cdefghi
nouveau plus d'entropie que la précédente. On peut désormais sans l'informatique car l'ajout d'un caractère inexistant augmente toujours l'entropie. En effet, H 2 est 2,8074.
Si la chaîne suivante était 42
la chaîne serait invalide, car H 3 serait 1, plus petit que 2,8074.
Si, en revanche, la séquence continuait à produire des chaînes d'entropie croissante avec une limite H ∞ = 3, le score serait (3−1,4597) / 6 = 0,2567.
Remerciements
Grâce à
@xnor pour son aide à relever le défi, et en particulier pour m'avoir convaincu que des chaînes infinies d'entropie croissante obtenues à partir d'une exécution itérée sont en effet possibles;
@flawr pour plusieurs suggestions, y compris la modification de la fonction de score, et pour écrire l'extrait très utile;
@Angs pour signaler un inconvénient essentiel dans une précédente définition de la fonction de score;
@Dennis pour une correction dans l'extrait de code JavaScript;
@ETHproductions pour une autre correction dans l'extrait de code ;
@PeterTaylor pour une correction dans la définition de l'entropie.
Extrait pour calculer l'entropie
la source
Réponses:
Gelée, 0,68220949
H 90 = 19,779597644909596802, H 0 = 4,088779347361360882, L 0 = 23
J'ai utilisé des doubles longs pour calculer H 90 . Les flotteurs à double précision ont indiqué à tort que H 47 <H 46
Le premier programme s'imprime
où
…
sert d'espace réservé pour tous les caractères Unicode avec des points de code compris entre 100 000 et 1 000 000 . La longueur réelle est de 900 031 caractères.Le programme des secondes s'imprime
qui, à son tour, imprime
etc.
Aucun de ces programmes ne fonctionne dans l'interpréteur en ligne, qui a une limite de sortie de 100 Ko . Cependant, si nous modifions le programme pour imprimer
0123456789
au lieu des 900 000 caractères Unicode susmentionnés , vous pouvez l' essayer en ligne!la source
MATLAB,
9.6923e-0050.005950967872272Cette nouvelle version est une version améliorée de la première "preuve de concept". Dans cette version, j'obtiens une grande augmentation de score dès la première itération. Ceci a été réalisé en "faisant exploser" la sortie du premier programme, qui est reproduit par tous les suivants. Ensuite, j'ai également essayé de trouver le minimum
H0
en ajoutant simplement le symbole le plus courant du code autant de fois que possible. (Cela avait évidemment une limite, car non seulement elle diminueH0
mais elle augmente égalementL0
en même temps. Vous pouvez voir l'évolution du score tracée en fonction de la taille du programme, où la taille varie en ajoutant ou en supprimant simplement1
.) les itérations sont toujours équivalentes à la version précédente ci-dessous.La version précédente:
Le code suivant est inspiré du quine matlab . Il sort essentiellement à nouveau deux fois . L'indice est que pour toute itération, nous avons des
n
lignes de code et desn-1
symboles de nouvelle ligne\n
. Ainsi, à l'n
approche de l'infini, le rapport des lignes de code aux sauts de ligne approche 1, et en même temps cela garantit que nous avons une croissance strictement monotone en entropie. Cela signifie également que nous pouvons facilement calculerHinf
en considérant simplement le code de génération zéro avec autant de nouvelles lignes que de lignes de code. (Que l'on peut confirmer expérimentalement, car il converge assez rapidement.)la source
10
par0
(et le réglage du reste du code pour cela)? Char0
est affiché comme espace par Matlab