A complexidade de Kolmogorov de uma string S é o comprimento do programa mais curto P , escrito em alguma linguagem de programação L , cuja saída é exatamente S .
(Sim, a definição real é mais formal, mas isso será suficiente para o desafio.)
Sua tarefa neste desafio é escrever o mais curto possível "Kolmogorov solver complexidade", isto é, um programa escrito em L em si que leva em uma série S e retorna o menor P escrito em L que as saídas S .
A abordagem ingênua para isso é iterar sobre todos os programas de comprimento 1, então todos os 2 programas de comprimento, em seguida, todos os 3 programas de comprimento, e assim por diante, correndo cada um deles e medir a saída até que um programa que saídas S é encontrado. O problema dessa abordagem é que alguns desses programas podem nunca parar de funcionar, o que significa que o solucionador em si nunca pode parar. E devido ao problema de interrupção, não existe uma maneira infalível de evitar os programas que não param.
Uma solução simples, embora imperfeita, é colocar um limite de tempo no tempo de execução de cada um dos P 's em potencial . Programas que não são interrompidos no tempo podem ser ignorados, mas o solucionador definitivamente irá parar (supondo que um programa em L possa realmente gerar S dentro do prazo).
Desafio
Escreva seu solucionador como um programa ou função que aceite três coisas:
- A string S .
- Um número inteiro positivo T que é o limite de tempo em segundos ou em um período menor (por exemplo, milissegundos).
- Uma sequência A do alfabeto de caracteres a ser usado para possíveis P 's.
E emite o mais curto P que contém apenas caracteres em Um , é executado em menos do que t unidades de tempo, e as saídas S .
Este é o pseudocódigo geral:
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
Detalhes
- Você pode assumir que sempre haverá um P feita a partir dos personagens em A que executa em tempo T que as saídas S .
- Você pode supor que a execução dos P 's em potencial não terá efeitos colaterais que impedem que o solucionador funcione ou funcione corretamente (como mexer com a memória alocada do solucionador).
- Você não pode presumir que os P potenciais estão livres de erros. Certifique-se de incluir
try
/catch
bloqueia ou o que for aplicável na chamada de execução. - Se houver vários P mais curtos , qualquer um será suficiente. "Shortness" é medido em caracteres, não em bytes.
- A saída de P potenciais é o que é impresso no stdout (ou na área de saída usual do seu idioma). A cadeia vazia é um potencial P .
- Idealmente, o seu solucionador permitirá que A contenha qualquer caractere. A deve pelo menos ser capaz de conter caracteres ASCII imprimíveis , além de guias e novas linhas.
- A entrada pode vir do arquivo / stdin / linha de comando / função args. A saída vai para stdout ou similar ou pode ser retornada como uma sequência se você escreveu uma função.
Pontuação
O envio com o menor número de bytes vence. O desempatador vai para a primeira submissão postada.