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.