Y en particular la segunda ley : la entropía de un sistema aislado aumenta con el tiempo .
Para este desafío,
- Se considerará que un " sistema aislado " es un programa o función (abreviado como "programa" de ahora en adelante);
- El paso del " tiempo " corresponderá a ejecuciones iteradas de la salida del programa. , consideradas como un nuevo programa;
- " Entropía " se tomará como la entropía de primer orden de Shannon (que se definirá a continuación), que es una medida de cuán diversos son los caracteres de la cadena.
El reto
Su programa debe producir una cadena no vacía que cuando se ejecuta como un programa en el mismo idioma produce una cadena con más entropía que la anterior. La iteración infinita de este proceso de ejecución de salida debe producir una secuencia estrictamente creciente de valores de entropía .
Las cadenas pueden contener cualquier carácter Unicode 9.0 . La secuencia de cadenas debe ser determinista (en lugar de aleatoria).
La entropía para una cadena dada se definirá de la siguiente manera. Identifique sus caracteres únicos y su número de ocurrencias en la cadena. La frecuencia p i del i -ésimo carácter único es el número de apariciones de ese carácter dividido por la longitud de la cadena. La entropía es entonces
donde la suma está sobre todos los caracteres únicos de la cadena. Técnicamente, esto corresponde a la entropía de una variable aleatoria discreta con distribución dada por las frecuencias observadas en la cadena.
Deje que H k denote la entropía de la cadena producida por el programa k -th, y deje que H 0 denote la entropía del código del programa inicial. Además, deje que L 0 denote la longitud del programa inicial en caracteres. La secuencia { H k } es monótona según los requisitos de desafío y está limitada (porque el número de caracteres existentes es finito). Por lo tanto tiene un límite, H ∞ .
La puntuación de una presentación será ( H ∞ - H 0 ) / L 0 :
- El numerador, H ∞ - H 0 , refleja hasta qué punto su código "obedece" la ley de aumentar la entropía en un lapso de tiempo infinito.
- El denonimador, L 0 , es la longitud del código inicial en caracteres (no en bytes).
El código con la puntuación más alta gana . Los empates se resolverán a favor de la presentación / edición más temprana.
Para calcular la entropía de una cadena, puede usar el fragmento de JavaScript (cortesía de @flawr y con correcciones de @Dennis y @ETHproductions ) al final de esta publicación.
Si obtener el límite H ∞ es difícil en su caso específico, puede usar cualquier límite inferior, digamos H 20 , para calcular el puntaje (entonces usaría ( H 20 - H 0 ) / L 0 ). Pero, en cualquier caso, la secuencia infinita de entropías debe aumentar estrictamente.
Incluya una explicación o una prueba breve de que la secuencia de entropías está aumentando, si eso no es evidente.
Ejemplo
En un lenguaje ficticio, considere el código aabcab
, que cuando se ejecuta produce la cadena cdefgh
, que cuando se ejecuta produce cdefghi
, que ...
Los caracteres únicos del código original son a
, b
y c
, con las frecuencias respectivas 3/6, 2/6 y 1/6. Su entropía es 1.4591. Esto es H 0 .
La cadena cdefgh
tiene más entropía que aabcab
. Podemos saber esto sin calcularlo porque para un número dado de caracteres la entropía se maximiza cuando todas las frecuencias son iguales. De hecho, la entropía H 1 es 2.5850.
La cadena cdefghi
nuevamente tiene más entropía que la anterior. Ahora podemos hacerlo sin computar porque agregar un carácter no existente siempre aumenta la entropía. De hecho, H 2 es 2.8074.
Si la siguiente cadena fuera 42
la cadena sería inválida, porque H 3 sería 1, menor que 2.8074.
Si, por otro lado, la secuencia continuaba produciendo cadenas de entropía creciente con límite H ∞ = 3, la puntuación sería (3−1.4597) / 6 = 0.2567.
Expresiones de gratitud
Gracias a
@xnor por su ayuda para mejorar el desafío y, en particular, por convencerme de que son posibles infinitas cadenas de entropía creciente obtenidas de la ejecución iterada;
@flawr para varias sugerencias, incluida la modificación de la función de puntuación y para escribir el fragmento muy útil;
@Angs para señalar un inconveniente esencial en una definición previa de la función de puntuación;
@Dennis para una corrección en el fragmento de JavaScript;
@ETHproductions para otra corrección en el fragmento;
@PeterTaylor para una corrección en la definición de entropía.
Fragmento para calcular la entropía
fuente
Respuestas:
Gelatina, 0.68220949
H 90 = 19.779597644909596802, H 0 = 4.088779347361360882, L 0 = 23
Usé dobles largos para calcular H 90 . Los flotadores de precisión doble informaron incorrectamente que H 47 <H 46
El primer programa imprime
donde
…
sirve como marcador de posición para todos los caracteres Unicode con puntos de código entre 100,000 y 1,000,000 . La longitud real es de 900,031 caracteres.El programa de segundos imprime
que, a su vez, imprime
etc.
Ninguno de estos programas funciona en el intérprete en línea, que tiene un límite de salida de 100 KB . Sin embargo, si modificamos el programa para imprimir en
0123456789
lugar de los 900,000 caracteres Unicode mencionados anteriormente , ¡puede probarlo en línea!fuente
MATLAB,
9.6923e-0050.005950967872272Esta nueva versión es una versión mejorada de la primera "prueba de concepto". En esta versión obtengo un gran aumento de puntaje desde la primera iteración. Esto se logró "explotando" la salida del primer programa, que se replica en todos los siguientes. Luego también intenté encontrar el mínimo
H0
simplemente agregando el símbolo más común del código tantas veces como sea posible. (Obviamente, esto tenía un límite, ya que no solo disminuyeH0
sino que también aumentaL0
al mismo tiempo. Puede ver el desarrollo de la puntuación trazada en función del tamaño del programa donde el tamaño varía simplemente agregando o quitando1
). Las iteraciones siguen siendo equivalentes a la versión anterior a continuación.Versión previa:
El siguiente código está inspirado en el matlab quine . Básicamente, solo vuelve a salir solo dos veces . La pista es que para cualquier iteración tenemos
n
líneas de código yn-1
símbolos de nueva línea\n
. Entonces, a medida que sen
acerca al infinito, la relación de líneas de código a líneas nuevas se acerca a 1, y al mismo tiempo esto garantiza que tenemos un crecimiento estrictamente monótono en la entropía. Eso también significa que podemos calcular fácilmenteHinf
simplemente considerando el código de generación cero con tantas líneas nuevas como líneas de código. (Cuál puede confirmar experimentalmente, ya que converge bastante rápido).fuente
10
por0
(y ajustando el resto del código para eso)? Charlab0
se muestra como espacio por Matlab