该柯尔莫哥洛夫复杂的字符串的小号最短程序的长度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没有错误。确保包括
try
catch
在执行调用中 / 块或任何适用的内容。 - 如果有多个最短的P,则任何一个都足够。“短”是用字符而不是字节来度量的。
- 潜在P的输出是打印到stdout的输出(或您语言的通常输出区域)。空字符串是一个潜在的P。
- 理想情况下,您的求解器将允许A包含任何字符。一个至少必须要能包含可打印的ASCII字符以及制表符和换行符。
- 输入可能来自文件/标准输入/命令行/功能参数。输出将输出到stdout或类似的文件,或者如果您编写了函数,则可以字符串形式返回。
计分
字节最少的提交将获胜。Tiebreaker最早发布。