编写Kolmogorov复杂度求解器


16

柯尔莫哥洛夫复杂的字符串的小号最短程序的长度P,写一些编程语言大号,其输出正好是小号
(是的,真正的定义比较正式,但这足以应付挑战。)

你在这个挑战任务是写的最短的“柯尔莫哥洛夫复杂解算器”,就是写在程序大号,它接受一个字符串本身小号,并返回最短P写在大号输出小号

天真的方法是遍历所有长度为1的程序,然后是所有长度为2的程序,然后是所有长度为3的程序,依次类推,依次运行每个程序并测量输出,直到找到输出S的程序。这种方法的问题在于其中某些程序可能永远不会停止运行,这意味着求解器本身可能永远也不会停止。而且由于停顿问题,没有确定方法可以避免程序无法停止。

一个简单但不完善的解决方案是对每个潜在P的执行时间设置时间限制。可能不会暂停的程序可能会被跳过,但是求解器肯定会停止(假设L中的程序确实可以输出在时限内 S)。

挑战

将您的求解器编写为包含三件事的程序或函数:

  • 字符串 s ^
  • 正整数 T,它是时间限制(以秒为单位)或一些较小的时间跨度(例如毫秒)。
  • 字符字母的字符串A用于潜在的P的。

并输出仅包含A中字符的最短P,以少于T个时间单位运行,并输出小号

这是一般的伪代码:

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

细节

  • 你可以假设总是会有一个P从角色中做出一个在时间用完牛逼输出š
  • 您可能会假设潜在P的执行不会产生妨碍求解器正常运行或正常工作的副作用(例如弄乱求解器分配的内存)。
  • 您可能不会认为潜在的P没有错误。确保包括trycatch在执行调用中 / 块或任何适用的内容。
  • 如果有多个最短的P,则任何一个都足够。“短”是用字符而不是字节来度量的。
  • 潜在P的输出是打印到stdout的输出(或您语言的通常输出区域)。空字符串是一个潜在的P
  • 理想情况下,您的求解器将允许A包含任何字符。一个至少必须要能包含可打印的ASCII字符以及制表符和换行符。
  • 输入可能来自文件/标准输入/命令行/功能参数。输出将输出到stdout或类似的文件,或者如果您编写了函数,则可以字符串形式返回。

计分

字节最少的提交将获胜。Tiebreaker最早发布。


7
我的脑袋疼。
Alex A.

1
您可以放宽对目标语言和元求解器编写的语言必须相同的要求吗?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2015年

而且,仅编写一个将输出转换为语言的字符串文字表示的程序是不可能的吗?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2015年

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳不,重点是要使用相同的语言。是的,但这并不总是最短的程序。
加尔文的爱好2015年

@ Calvin'sHobbies:最终,找出哪种语言可以轻松地将代码编写到调用工具(或在不存在的地方实现编译器)来编译语言本身,这只是代码挑战。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Answers:


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_output在Python 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 char Python 3程序的Pastebin链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.