柯尔莫哥洛夫躁狂症


32

字符串s 的Kolmogorov复杂度定义为输出s 的最短程序 P 的长度。如果P的长度短于s的长度,则称s是可压缩的,否则s是不可压缩的。大多数字符串是不可压缩的...

编写输出此字符串的最短程序(无空格和无换行符):

d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95 
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82 
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49 
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e 
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a 
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85 
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7 
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83 
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32 
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5 
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5 
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48 
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39 
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60 
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15 
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e 
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48 
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6 
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c 
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa 
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94 

输出应如下所示:

d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294

注意:不允许用户输入,也不允许Web访问,也不允许库(打印输出所需的库除外)。

编辑我:序列似乎是随机的...但是事实证明,它是高度可压缩的,处理一点质数...

编辑II:做得好!我将在接下来的几个小时内查看答案,然后分配赏金。这是我关于如何解决的想法:

  1. 如果您尝试压缩数据,那么您不会走远...
  2. 在Internet上,您可以找到(众所周知的)整数序列在线百科全书(OEIS);
  3. 尝试使用第一个十六进制数字d9, a6, b6, 33, ...(或其十进制表示形式)没有结果;
  4. 但是如果将数字转换为二进制(1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0)并在OEIS上进行搜索,则会得到此结果
  5. 就像克劳迪乌(Claudiu)指出的那样,我在问题中也给出了一点提示(上面的“我编辑”)... :-)

获胜者是:彼得泰勒(GolfScript,50),特别提到克劳迪(Python,92),这是第一个“解决”它的人。


2
这比其他komogorov复杂性问题更有趣吗?
门把手

2
@Doorknob:也许什么也没有……至少在有人发表答案之前:-)
Marzio De Biasi 2014年

5
这应该是“猜常数”的游戏吗?
彼得·泰勒

7
不要给出解决方案!人们正在努力:-)
Mau

3
我认为比赛应该分为两个部分。第一部分是对找到答案的人的奖励。第二部分是对那些真正知道如何压缩代码并生成最小代码的人的奖励。现在,它更多地是一个“猜我的算法”问题,它不包括像我这样的笨蛋,但不包括真正的代码高尔夫职业者(我也不是),以及那些了解APL和其他简洁语言的人(仍然不是我) )。

Answers:


11

GolfScript(50字节)

$ wc -c codegolf24909.min.gs 
50 codegolf24909.min.gs
$ md5sum codegolf24909.min.gs 
ce652060039fba071d17333a1199fd72  codegolf24909.min.gs
$ time golfscript.rb codegolf24909.min.gs 
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884a5c626ba6aeccde7294

real    365m11.938s
user    364m45.620s
sys     0m6.520s

由于其他所有人现在都在公开他们的代码,因此我也将优先于OP的要求,以消除混淆:

38200,{:x,{)x\%!},,2=},4/{3\{2&!!1$++}/.57>39*+}%+

概述解剖

  • 计算小于N的素数,N = 38200:这给出前4032个素数:38200,{:x,{)x\%!},,2=},
  • 我们希望每个素数一位,并进行十六进制转换,因此将它们分成4组: 4/
  • 对于每个组,将每个质数映射pp&2 != 0,并执行从2到16的基数转换{3\{2&!!1$++}/.57>39*+}%(这是有趣的技巧所在)
  • 现在,我们有了一个ASCII值数组,加上stdin中的空字符串。将它们连接起来以获得单个字符串以供输出:+

基本转换的详细剖析

给定一个堆栈,其中包含一个空字符串和一个素数列表,我们需要进行两次转换:

  1. 将每个素数转换为指示它等于2还是3(模4)的位
  2. 将位转换为十六进制数字

做1有很多同样长的方法;例如

{4%1>}%
{4%2/}%
{2/1&}%
{2/2%}%
{2&!!}%

甚至

{2&}% followed by a 2/ after the base conversion

对于2,显而易见的方法是

2base 16base{'0123456789abcdef'=}%+

但是base是一个很长的词,由于16 = 2 4,我们可以轻松地保存一些字符

4/{2base'0123456789abcdef'=}%+

现在,最明显的浪费是专用于该字符串的18个字符。我们只需要一个从数字到ASCII码的功能。我们要映射0'0' = 48,...,9'9' = 5710'a' = 97,... 15'f' = 102

4/{2base.9>39*+48+}%+

但是现在禁止混合使用base。我们需要自己实施。显而易见的实现(在这个方向上,简单的实现)是k basefold {\k*+}*。稍长的替代方法是简单的迭代,它需要一个基本案例:0\{\k*+}/。基数2有点特殊:1$++等同于\2*+相同的长度,我采用了这种方法。

两者都比5字符长2base,但是由于我们现在要遍历这些值,因此可以在第1部分中拉入一个循环。我们取代

{2&!!}%4/{2base.9>39*+48+}%+

4/{{2&!!1$++}*.9>39*+48+}%+

节省1个字符,或者

4/{0\{2&!!1$++}/.9>39*+48+}%+

损失1个字符。

但是,尽管1个字符的丢失看起来像是倒退了一步,但请考虑一下该0会发生什么。它乘以16,然后添加到基本转换输出中。最后,我们要做的是在输出中添加16的倍数。所以我们可以将两者结合起来

4/{3\{2&!!1$++}/.57>39*+}%+

联合最短和奖金聪明使它变得更加有趣。


1
360分钟!那已经有一段时间了。想知道您采取了什么方法。.我的花费
不到

4
@Claudiu,我可以提高它的速度,但是它将添加大约5个字符,这是kolmogorov复杂度,而不是有时间限制的代码高尔夫球。
彼得·泰勒

如果使用过的话,您能得到多少base呢?所有其他解决方案都使用等效的方法(mine用途hex,C用途printf("%x"),haskell用途showHex
Claudiu 2014年

1
@Claudiu,实际上我目前使用的最佳方法base比这种方法更长,因为在澄清了我无法使用它之后,我做了大部分优化工作。base给我一个从0到15的值,因此仍然需要一些工作才能转换为0-9a-f。我可能会base在某个时候(而不是今晚)重新使用。
彼得·泰勒

32

Python,92个字符

这里是女士们,先生们,代码本身!

>>> code = "R=range;print hex(int(''.join(`i/2%2`for i in R(38198)if all(i%x for x in R(2,i))),2))[2:-1]"
>>> len(code)
92
>>> exec code
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884a5c626ba6aeccde7294
>>> import hashlib; hashlib.sha256(code).hexdigest()
'60fa293bbe895f752dfe208b7b9e56cae4b0c8e4cdf7c5cf82bf7bab60af3db6'

马齐奥(Marzio)留下了一个聪明的暗示,他说:“事实证明,处理一点点是高度可压缩的质数。我确定“小数位”不是偶然的斜体,所以我将十六进制字符串转换为小数位并尝试查找模式。我以为,起初他将所有质数表示为位并将它们连接在一起,但这并没有解决。然后可能只取几位数字,或将所有零丢弃在位串中-仍然没有。也许是前几个素数中最低有效位的一点点字符串?不完全的。但是最终我找到了一个有效的方法,它是第一个但是很多素数中第二个最低有效位的位串。

因此,我的代码就是这样:生成足够的素数,取每个(i/2%2)的第二位,将它们连接为二进制字符串,然后将其转换为base-10(int(..., 2)),再转换为base-16(hex(...))。


1
大!我是打高尔夫球的新手,但是哈希的东西是让其他人发现“方法”的好方法。我将等待两天,然后打开赏金计划(我会在信任时给予奖励:)。
Marzio De Biasi 2014年

5
@MarzioDeBiasi:当然可以!或者,也许更好的说法是,您将在赏金到期的前一天进行奖励,如果获胜者没有透露自己的答案,那么第二名将获胜,等等。。。 ?
Claudiu 2014年

为什么没有计算hashlib中的代码?是否正在运行代码以生成输出?
philcolbourn 2014年

2
@philcolbourn:没有代码不使用hashlib。只是生成sha256哈希,所以明天我可以证明我在第一次发布该代码时编写了代码。明天见!
Claudiu 2014年

@Claudiu:现在您应该向我解释一下您是如何解决这个问题的!做得好!
rubik 2014年

9

哈斯克尔(105)

SHA1哈希: a24bb0f4f8538c911eee59dfc2d459194ccb969c

输出:

d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884988

编辑:代码:

import Numeric;f(x:z)s=f[y|y<-z,0/=mod y x]$s*2+quot(mod x 4)2;f[]s=s;main=putStr$showHex(f[2..38198]0)""

我错过了关于不使用除打印(putStr)之外的任何库函数的规则。我假设数学运算符虽然在技术上是功能,但允许使用。


9

C,136个 116 109 103字符

好吧,这是我的努力:

i;p;q;main(n){for(;n++,q<4032;){for(i=1;++i<n&&n%i;);if(i==n)p+=p+(n&2)/2,p=++q&3?p:printf("%x",p)*0;}}

MD5 hash = f638552ef987ca302d1b6ecbf0b50e66

1
由于printf返回的字符数在此处始终为非零,因此您可以使用!printf(...)而不是printf(...)*0保存一个字符。
pastebin.com斜线0mr8spkT 2014年

@ace *额头*啊,我为什么没想到呢?感谢ace,一如既往:-)(也可以保留原样的代码,因为它应该与MD5哈希匹配。)
sosamage ossifrage

7

JS 764

如果我们将此字符串视为base64,则可以使用unbase-64-ed版本使用较小的版本:

btoa("wÖºo­÷离÷ÛÖôiÎßÙ¦éÝ}oÎáÇüo­iÏyk^áæ¹õÖ÷{·=áÎ=ç×÷÷i®÷×^ZáÝýï6yÇÛw}swßÎo¶ºÑ×voûÛ~xiÝ[ïÖéî=çv÷Zk½Ú駽{vqÝïÖs­vo}å¶øï®u×¾÷÷õ¦¶{½yé®y×áîk~\Ùöëwoºkv÷¯Ùç7wÏ<õ¿kÝz÷Ûn[kg¶qÍ[Û·x{Ç[׶¸ßß9q¦å¾ß­¸ww:¯xi×{ÑþõÛµoW9yþ¹ßñ×{Õ¯;Õí¹uþ]sMwonå®{ÛÏ|mÞ5ë­8yÖ¶çg=iÏ7o~ç®ÞwW:qÎw᮶s}kÖöwÛf¹k×øoo}Û}öÇÛiî<é¯õ¦ùã®Úß®}õÿvw}¹o}mßá®=ëf¹{}}·¹m¦¶ß]kÝúÕÖ½sÞ½óÞûé¦ößÕݶëW9snºÕǶï®øçf¹wß8oßk¦ù×ÛÞ|ofÜ÷­z×®<9mÝßm[ÝÞá½onõ§}ßf¸á¾\mÏvo¶÷Û­ý}®6ÙÞ¸yÝZïÞ=áÆ·o¿9ofº{owÞy÷GµkÏ;á¾´k§µm§8m·ßmýï¯tk¦øs®¹ïÞµ÷VÝÞxo½|ÝÝyá½:u½ôñ®á¦µßùåÝÛwß|iÎyå½tuÖ÷{g^^o}çto§Ù¶ñÿ<ñßyå®ùuþ}ÙÝ\å®{Çøy®<oÞzuæ´÷oukÝyáÎyw½Ý®úñí8m§»of{ÖÙ§zÛ}÷ãÝs½çg·é®;çFÚi÷¸{uk}xëyÛ¦÷ñ¾mÆå¯ví¦iÖºu¾wÙï{Ó®m­Úë®=áßyw¾¹sfs}Z÷owÝ÷snÙ½ûçwsß<á®\ënk¦qÇ^ïox")

但是,我认为作者希望我们找到该非随机字符串背后的逻辑。


1
为了避免“投票失败”,我在问题中添加了一些细节:-)
Marzio De Biasi 2014年

4

Mathetmatica-56

谜团已经解决,所以只需执行一下想法

⌊.5Prime@Range@4032⌋~Mod~2~FromDigits~2~IntegerString~16

真好 我很好奇,这只猫从袋子里掏出来的最短可能性是什么
Claudiu 2014年

您是否称其为“没有库(打印输出所需的库除外)”?
彼得·泰勒

@PeterTaylor是的,没有导入-没有库。
swish 2014年

从评论来看,我不认为这就是OP想要解释它的方式。
彼得·泰勒

3

J-46个字符

别介意我,只需在此处记录J高尔夫即可后代。不够聪明,无法找出诀窍。

4[1!:2&4'0123456789abcdef'{~#.2|<.-:p:i.1007 4

解释:

  • p:i.1007 4-从0开始,创建一个1007行,四列的整数矩阵,然后取对应于这些整数的质数。是,p:是J内置的。是的,我们还差四个素数。

  • 2|<.-:-将每个数字(-:)减半,将其下限(<.),然后取模2(2|)。这与获取下一个租赁有效位相同。

  • #.-将以2为底的结果的每一行转换为整数。这为我们提供了1007个数字,范围从0到15(含)。

  • '0123456789abcdef'{~#.-将该位矩阵的每一行作为一个数字的二进制,然后使用该数字从十六进制数字列表中进行选择。这会将每四个位转换为十六进制。

  • 1!:2&4-J解释器在输出长度超过256个字符的字符串时遇到问题,因此我们必须将此数据直接发送到stdout。你赢了一些,你输了一些。

  • 4[-最后,丢弃结果1!:2,而从输出中输出缺少的4。我们这样做是因为它比包括最后四个素数并在此处返回空结果要短。


0

JS 503

以下@xem想法:

s='Ù¦¶3V§K)°¬*ªm¸KLø¶*¬¡KN¥³çÉLIY쳪lZM9uìê$ÌÓ-Ã8N·¦\nÒµ7#T­yªnIURZ§:jéäRÍ-y­Æµ[´vQNó¢çjUMNJ£\/«c̵¦¤.ÃØ©õ3"[¢âÌ'+"'"+'ÔèÛ¤9ʪ[O6$ÓÆö­×q$á±Åïe5l×%ß]À²oZW(½Afí¢Rɬ³lV~ÑÆÌSJbÅY©²Ô¯"¥©ô²#2øû®HjµFz6YÓ%µ½JIb¥äYûåº\n5Ý©6©Éiwj²4-"aÅÂfâvtR¥Ù¹¦µì)X²¼HõŽ/2=OK.²kÙ2¤K\¼·³&9úB-díyIL£·²¦âÙUá¨K`¦áºÄ»ì29v¦´Æeyaª=T·=KÛ0MJ¡5u];Ù¬U[ݳâÌñ^³+S¶î+¬ZußY-ZLèôêH¹VÞ ©LUÕé:vºç²ªé«*Ö#3E=ÄéRãjGPº¯äå£c&³L¼ªZz«­¦ÛS.mº:fIM×eªÃ?ÊÂl+7UÉJ\bk¦®ÌÞr'
r=''
for(var i=0;i<s.length;i++) r+=s.charCodeAt(i).toString(16);
console.log(r)

0

Mathematica,55岁

Prime~Array~4031~BitAnd~2~FromDigits~2~IntegerString~16

在Mathematica 8上进行了测试。它利用了两个观察结果:

  • Mathematica FromDigits实际上并不会检查给定数字的范围,因此,如果将其应用于表格列表,则{2,0,2,2,0,...}得到的结果就像应用于的两倍{1,0,1,1,0,...}。但这正是由BitAnd 2加上质数。
  • 我们希望其十六进制表示形式的数字的最后一位恰好为零(字符串以偶数数字结尾证明),因此它只是数字的两倍,少了一个质数。但是有两个因素正是我们从以前的观察中获得的结果,因此一切都完美地融合在一起。
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.