La complejidad de Kolmogorov de una cadena S es la longitud del programa más corto P , escrito en algún lenguaje de programación L , cuya salida es exactamente S .
(Sí, la definición real es más formal, pero esto será suficiente para el desafío).
Su tarea en este reto es escribir el más breve posible "la complejidad de Kolmogorov solucionador", es decir, un programa escrito en L misma que lleva en una cadena S y devuelve el menor P escrito en L que las salidas S .
El enfoque ingenuo para esto es iterar sobre todos los programas de longitud 1, luego todos los programas de longitud 2, luego todos los programas de longitud 3, y así sucesivamente, ejecutando cada uno de ellos y midiendo la salida hasta que se encuentre un programa que produzca S. El problema con este enfoque es que es posible que algunos de estos programas nunca dejen de ejecutarse, lo que significa que el solucionador mismo nunca se detendrá. Y debido al problema de detención, no hay una forma segura de evitar los programas que no se detienen.
Una solución simple, aunque imperfecta, es poner un límite de tiempo al tiempo de ejecución de cada una de las P potenciales . Los programas que no se detienen a tiempo pueden pasarse por alto, pero el solucionador definitivamente se detendrá (suponiendo que un programa en L pueda generar S dentro del límite de tiempo).
Desafío
Escriba su solucionador como un programa o función que abarca tres cosas:
- La cadena S .
- Un entero positivo T que es el límite de tiempo en segundos o un lapso de tiempo menor (por ejemplo, milisegundos).
- Una cadena A del alfabeto de caracteres para usar para potenciales P 's.
Y da salida a la más corta P que sólo contiene caracteres de A , se ejecuta en menos de T unidades de tiempo, y las salidas S .
Este es el pseudocódigo general:
Function KolmogorovComplexitySolver(S, T, A):
Assign N to 0
Loop until function returns:
In any order, iterate over all strings of length N that only contain characters from *A*. Call the current string P:
Execute P, saving the output to O, stopping the execution if it takes longer than time T
If (P did not throw any errors) and (P did not timeout) and (O and S are identical):
Return P
Add 1 to N
Detalles
- Usted puede asumir que siempre habrá un P hechos de los personajes en una que se ejecuta en el tiempo t que las salidas S .
- Puede suponer que la ejecución de las P potenciales no tendrá efectos secundarios que eviten que el solucionador se ejecute o funcione correctamente (como jugar con la memoria asignada del solucionador).
- Es posible que no asuma que los potenciales P 's son libres de error. Asegúrese de incluir
try
/catch
blocks o lo que sea aplicable alrededor de la llamada de ejecución. - Si hay múltiples P más cortas , entonces cualquiera será suficiente. La "brevedad" se mide en caracteres, no en bytes.
- La salida de P potenciales es lo que se imprime en stdout (o el área de salida habitual de su idioma). La cadena vacía es una P potencial .
- Idealmente, su solucionador permitirá que A contenga cualquier carácter. Al menos debe ser capaz de contener caracteres ASCII imprimibles más pestañas y líneas nuevas.
- La entrada puede provenir de file / stdin / command line / function args. La salida va a stdout o similar, o puede devolverse como una cadena si escribió una función.
Puntuación
El envío con la menor cantidad de bytes gana. Tiebreaker va a la presentación más temprana publicada.