E, em particular, a segunda lei : a entropia de um sistema isolado aumenta com o tempo .
Para este desafio,
- Um " sistema isolado " será considerado um programa ou função (abreviado como "programa" a partir de agora);
- A passagem do " tempo " corresponderá às execuções iteradas da saída do programa , consideradas como um novo programa;
- " Entropia " será tomada como entropia de primeira ordem de Shannon (a ser definida abaixo), que é uma medida da diversidade dos caracteres da string.
O desafio
Seu programa deve produzir uma string não vazia que, quando executada como um programa no mesmo idioma, produz uma string com mais entropia que a anterior. A iteração infinita desse processo de execução-saída deve produzir uma sequência estritamente crescente de valores de entropia .
As cadeias podem conter qualquer caractere Unicode 9.0 . A sequência de strings deve ser determinística (em oposição a aleatória).
A entropia para uma determinada sequência será definida da seguinte maneira. Identifique seus caracteres exclusivos e seu número de ocorrências na sequência. A frequência p i do i- ésimo caractere exclusivo é o número de ocorrências desse caractere dividido pelo comprimento da string. A entropia é então
onde a soma está sobre todos os caracteres exclusivos da string. Tecnicamente, isso corresponde à entropia de uma variável aleatória discreta com distribuição dada pelas frequências observadas na string.
Deixe H k denotar a entropia da string produzida pelo k- ésimo programa e H 0 denote a entropia do código do programa inicial. Além disso, deixe L 0 denotar o comprimento do programa inicial em caracteres. A sequência { H k } é monótona conforme os requisitos de desafio e é limitada (porque o número de caracteres existentes é finito). Portanto, ele tem um limite, H ∞ .
A pontuação de uma submissão será ( H ∞ - H 0 ) / L 0 :
- O numerador, H ∞ - H 0 , reflete em que medida seu código "obedece" à lei do aumento da entropia ao longo de um período de tempo infinito.
- O denonimator, L 0 , é o comprimento do código inicial em caracteres (não em bytes).
O código com a pontuação mais alta vence . Os laços serão resolvidos em favor da submissão / edição mais antiga.
Para calcular a entropia de uma string, você pode usar o JavaScript trecho (cortesia de @flawr e com correções de @ Dennis e @ETHproductions ) no final deste post.
Se a obtenção do limite H ∞ for difícil no seu caso específico, você poderá usar qualquer limite inferior, digamos H 20 , para calcular a pontuação (portanto, você usaria ( H 20 - H 0 ) / L 0 ). Mas, em qualquer caso, a sequência infinita de entropias deve aumentar estritamente.
Inclua uma explicação ou prova curta de que a sequência de entropias está aumentando, se isso não for evidente.
Exemplo
Em uma linguagem fictícia, considere o código aabcab
que, quando executado, produz a string cdefgh
, que, quando executado cdefghi
, que ...
Os caracteres únicos do código original são a
, b
e c
, com as respectivas frequências de 3/6, 2/6 e 1/6. Sua entropia é 1.4591. Este é H 0 .
A cadeia cdefgh
tem mais entropia que aabcab
. Podemos saber isso sem calculá-lo porque, para um determinado número de caracteres, a entropia é maximizada quando todas as frequências são iguais. Com efeito, a entropia H 1 é 2,5850.
A string cdefghi
novamente tem mais entropia que a anterior. Podemos agora sem computação, porque adicionar um caractere inexistente sempre aumenta a entropia. Com efeito, H 2 é 2,8074.
Se a próxima string fosse 42
a cadeia seria inválida, porque H 3 seria 1, menor que 2,8074.
Se, por outro lado, a sequência continuasse produzindo seqüências de entropia crescente com o limite H ∞ = 3, a pontuação seria (3−1.4597) / 6 = 0,2567.
Agradecimentos
Graças a
@xnor por sua ajuda para melhorar o desafio e, em particular, por me convencer de que são infinitas cadeias infinitas de crescente entropia obtidas com a execução iterada;
@flawr para várias sugestões, incluindo a modificação da função score e para escrever o snippet muito útil;
@Angs por apontar uma desvantagem essencial em uma definição anterior da função score;
@Dennis para uma correção no snippet JavaScript;
@ETHproductions para outra correção no snippet;
@ PeterTaylor para uma correção na definição de entropia.