Kolmogorov Complexity Solverを書く


16

文字列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にエラーがないと仮定することはできません。実行呼び出しの前後に/ ブロックまたは適切なものを含めてください。trycatch
  • 最短のPが複数ある場合は、どれでも十分です。「ショートネス」は、バイトではなく文字で測定されます。
  • 潜在的なPの出力は、stdout(または言語の通常の出力領域)に出力されるものです。空の文字列は潜在的なPです。
  • 理想的には、ソルバーはAに任意の文字を含めることを許可します。含まれていることができるようにするため、少なくとも必見印刷可能なASCII文字とタブ、改行を。
  • 入力はfile / stdin / command line / function argsから来る場合があります。出力はstdoutなどに出力されるか、関数を作成した場合は文字列として返されます。

得点

最少バイト送信が勝ちです。Tiebreakerは、投稿された最も早い投稿に進みます。


7
脳が痛い。
アレックスA.

1
ターゲット言語とメタソルバーが記述されている言語が同じでなければならないという要件を緩和できますか?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

そして、出力を言語の文字列リテラル表現に変換するプログラムを書くことはできないでしょうか?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳いいえ、ポイントは同じ言語で行うことです。はい、しかしそれは常に最短のプログラムではありません。
カルビンの趣味

@ Calvin'sHobbies:結局のところ、どの言語が簡単にコードを記述してファシリティを呼び出す(またはコンパイラーを実装しない)かを調べて、言語自体をコンパイルするのはコードゴルフの挑戦ですか?
-n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

回答:


11

Python 3、240 236バイト

import subprocess as s,itertools as i
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   try:
    P="".join(P);open("a","w").write(P)
    if s.check_output(["py","-3","a"],timeout=T).decode()==S:return P
   except:1
  N+=1

これを実行しないでください。私のコンピューターでは、少なくとも、プロセスごとにポップアップウィンドウが作成されるため、実行を開始するとプログラムを停止するのが非常に困難でした。

timeoutsはsubprocess.check_outputPython 3でのみ追加されたため、Python 2ではなくこれを使用しています。

これtime.sleepは、途中で見つかったすべての有効なプログラムと、対応する出力も出力する代替バージョンです。

import subprocess as s,itertools as i
import time
def f(S,T,A,N=0):
 while 1:
  for P in i.product(A,repeat=N):
   time.sleep(0.2)
   try:
    P="".join(P);open("a","w").write(P);C=s.check_output(["py","-3","a"],timeout=T).decode()
    print(P,repr(C))
    if C==S:return P
   except:1
  N+=1

プログラムは、テストaする各プログラムのファイル名を使用するためP、これを実行する場合は、その名前のファイルがないことを確認してください。["py","-3","a"]セットアップに適したコマンド(["python","a"]または["python3","a"])に置き換えます。

sleep自己責任で期間を変更してください:)。のようf("1\r\n",1,"1()print")に呼び出しTます。ここで、タイムアウトは秒単位です。

上記の呼び出しによるテスターからの出力の最初の数行:

 ''
1 ''
11 ''
() ''
111 ''
(1) ''
int ''
1111 ''

(あなたは少しに沿ってプログラムを手助けしたい場合は、変更することができますP="".join(P)P="print"+"".join(P)

上記のプログラムにはすべて出力f("1\r\n",1,["print","(",")","1"])がないため、結果は次のとおりです(トークンはチャレンジの一部ではありませんが、何が起こるかを示したかったのです)。

 ''
print ''
1 ''
() ''
11 ''
print() '\r\n'
(print) ''
(1) ''
111 ''
print(print) '<built-in function print>\r\n'
print(1) '1\r\n'

戻り値は文字列'print(1)'です。

最後に、楽しみのためだけに、ここにアルファベットがある場合に何が起こるかだstring.printableすなわち、

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c

すべての有効な0-2文字のPython 3プログラムのPastebinリンク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.