文字列Sのコルモゴロフの複雑さは、出力が正確にSであるプログラミング言語Lで書かれた最短プログラムPの長さです。(はい、実際の定義はより形式的ですが、これは課題に十分です。)
この挑戦であなたの仕事は、で書かれたプログラムであり、可能な限り最短の「コルモゴロフ複雑性ソルバー」、書くことであるLの文字列を取り込み自体Sと最短返しPで書かれたL出力というSを。
これに対する単純なアプローチは、すべての長さ1のプログラム、次にすべての長さ2のプログラム、すべての長さ3のプログラムなどを繰り返し、それぞれを実行して、Sを出力するプログラムが見つかるまで出力を測定することです。このアプローチの問題は、これらのプログラムの一部が実行を停止しない可能性があることです。つまり、ソルバー自体が停止することはありません。そして、停止する問題のため、停止しないプログラムを回避する確実な方法はありません。
単純ですが不完全な解決策は、潜在的なPのそれぞれの実行時間に時間制限を設けることです。時間内に停止しないプログラムは渡されますが、ソルバーは確実に停止します(Lのプログラムが実際に制限時間内にSを出力できると仮定)。
チャレンジ
ソルバーは、次の3つのことを行うプログラムまたは関数として記述します。
- 文字列S。
- 秒単位の制限時間またはそれより短い時間範囲(ミリ秒など)である正の整数T。
- 文字列Aの潜在的に使用する文字のアルファベットのPさん。
また、Aの文字のみを含む最短のPを出力し、T時間単位未満で実行し、Sを出力します。
これは一般的な擬似コードです。
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
詳細
- Sを出力する時間Tで実行されるAの文字から作成されたPが常に存在すると想定できます。
- 潜在的なPの実行には、ソルバーの実行または正常な動作を妨げる副作用はありません(ソルバーに割り当てられたメモリをいじるなど)。
- 潜在的なPにエラーがないと仮定することはできません。実行呼び出しの前後に/ ブロックまたは適切なものを含めてください。
try
catch
- 最短のPが複数ある場合は、どれでも十分です。「ショートネス」は、バイトではなく文字で測定されます。
- 潜在的なPの出力は、stdout(または言語の通常の出力領域)に出力されるものです。空の文字列は潜在的なPです。
- 理想的には、ソルバーはAに任意の文字を含めることを許可します。含まれていることができるようにするため、少なくとも必見印刷可能なASCII文字とタブ、改行を。
- 入力はfile / stdin / command line / function argsから来る場合があります。出力はstdoutなどに出力されるか、関数を作成した場合は文字列として返されます。