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.