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.
Snippet para calcular a entropia
fonte
Respostas:
Gelatina, 0,68220949
H 90 = 19,779597644909596802, H 0 = 4,088779347361360882, L 0 = 23
Usei duplas longas para calcular o H 90 . Flutuadores de precisão dupla relataram incorretamente que H 47 <H 46
O primeiro programa imprime
onde
…
serve como um espaço reservado para todos os caracteres Unicode com pontos de código entre 100.000 e 1.000.000 . O comprimento real é 900.031 caracteres.O programa de segundos é impresso
que, por sua vez, imprime
etc.
Nenhum desses programas funciona no intérprete online, que possui um limite de saída de 100 KB . No entanto, se modificarmos o programa para imprimir, em
0123456789
vez dos 900.000 caracteres Unicode mencionados acima , você poderá experimentar online!fonte
MATLAB,
9.6923e-0050.005950967872272Esta nova versão é uma versão aprimorada da primeira "prova de conceito". Nesta versão, recebo um grande aumento de pontuação desde a primeira iteração. Isso foi conseguido "explodindo" a saída do primeiro programa, replicada por todos os programas subseqüentes. Depois, tentei também encontrar o mínimo
H0
, acrescentando o símbolo mais comum do código quantas vezes possível. (Obviamente, isso tinha um limite, pois não apenas diminui,H0
mas também aumentaL0
ao mesmo tempo. Você pode ver o desenvolvimento da pontuação plotada em relação ao tamanho do programa em que o tamanho é variado apenas adicionando ou removendo1
.) as iterações ainda são equivalentes à versão anterior abaixo.Versão anterior:
O código a seguir é inspirado no matlab quine . Basicamente, gera apenas a si próprio novamente duas vezes . A pista é que, para qualquer iteração, temos
n
linhas de código en-1
símbolos de nova linha\n
. Assim, comon
abordagens ao infinito, a proporção de linhas de código e novas linhas se aproxima de 1, e ao mesmo tempo isso garante que tenhamos um crescimento estritamente monótono na entropia. Isso também significa que podemos calcular facilmenteHinf
considerando o código de zero-geração com igualmente muitas novas linhas como linhas de código. (Qual deles pode confirmar experimentalmente, pois converge rapidamente).fonte
10
por0
(e ajustando o restante do código para isso)? Char0
é exibido como espaço por Matlab