コルモゴロフマニア


32

文字列s のコルモゴロフ複雑度は、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アクセス、ライブラリは許可されていません(出力の印刷に必要なものを除く)。

編集I:シーケンスはランダムに見えます...しかし、それは非常に圧縮性が高く、少しの素数を処理することがわかります...

編集II:よくやった!次の数時間で回答を確認し、賞金を割り当てます。これはどのように解決できるかについての私の考えです:

  1. データを圧縮しようとすると、遠くに行かない...
  2. インターネットでは、(よく知られている?)整数シーケンスのオンライン百科事典(OEIS)を見つけることができます。
  3. 最初の16進数d9, a6, b6, 33, ...(または10進数表現)を試しても結果は得られません。
  4. しかし、数値をバイナリに変換し(1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0)、OEISで検索すると、この結果が得られます
  5. Claudiuが述べたように、私も質問に少しヒントを与えました(上記の編集I)... :-)

勝者は:Peter Taylor(GolfScript、50)、Claudiu(Python、92)に特別な言及があり、それを最初に「解決」した人。


2
他のkomogorov-complexityの質問よりも、これはどのように興味深いのでしょうか?
ドアノブ

2
@Doorknob:たぶん何も...少なくとも誰かが答えを投稿するまで:
マルツィオ・デ・ビアシ14年

5
これは、「定数を推測する」ゲームと想定されていますか?
ピーターテイラー14年

7
解決策を与えないでください!人々はそれに取り組んでいます:-)
マウ14年

3
コンテストは2つの部分に分けられるべきだと思う。最初の部分は、答えを見つけた人に与えられる賞です。第二部は、コードを圧縮して最小のものを生成する方法を本当に知っている人に与えられる賞です。現時点では、「アルゴリズムを推測する」という質問の方が多く、私のような退屈な人だけでなく、実際のコードゴルフのプロ(これも私ではありません)、およびAPLやその他の簡潔な言語を知っている人(まだ私ではありません) )。

回答:


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 = 38200でN より小さい素数を計算します:これは最初の4032素数を与えます:38200,{:x,{)x\%!},,2=},
  • 16進変換を使用して、素数ごとに1ビットが必要なので、それらを4つのグループに分割します。 4/
  • 各グループについて、各素数pをにマッピングp&2 != 0し、ベース2からベース16への変換を行います{3\{2&!!1$++}/.57>39*+}%(これが興味深いトリックです)。
  • これで、ASCII値の配列と、stdinからの空の文字列ができました。それらを連結して、出力用の単一の文字列を取得します。+

基本変換の詳細な分析

空の文字列と素数のリストを保持するスタックがある場合、2つの変換を行う必要があります。

  1. 各素数を2または3(mod 4)に等しいかどうかを示すビットに変換します
  2. ビットを16進数に変換します

同じように長い方法がたくさんあります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 baseは、フォールド{\k*+}*です。少し長い代替案は、基本ケースが必要な単純な反復です0\{\k*+}/。ベース2は少し特殊です。同じ長さの場合と1$++同等\2*+であり、そのアプローチを採用しました。

どちらも5-charよりも長い2baseですが、値を繰り返し処理しているので、パート1で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の倍数を追加します。したがって、2つを次のように組み合わせることができます。

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

ジョイントの最短とボーナスの賢さは、それをより面白くします。


1
360分!それはかなりの時間です。あなたが取ったアプローチのだろうが...私のは、<1分かかる
クラウディウ

4
@Claudiu、私はそれをはるかに速くすることができましたが、それは約5文字を追加し、これは時間制約のあるコードゴルフではなく、コルモゴロフの複雑さです。
ピーターテイラー14

あなたが使用した場合、あなたはそれをどれくらい下げることができますbaseか?他のすべてのソリューションは同等のものを使用します(私の使用hex、Cの使用printf("%x")、haskellの使用showHex
Claudiu 14

1
@Claudiu、実際には私の現在の最良のアプローチbaseはこれよりも長いです。なぜなら、私はそれを使用できないことを明確にした後、ほとんどの最適化を行ったからです。baseは0から15の値を与えてくれるので、に変換するには多少の作業が必要0-9a-fです。baseある時点で再び使用するかもしれませんが、今夜は使用しないでください。
ピーターテイラー14

32

Python、92文字

ここでは、紳士men女、コードそのものです!

>>> 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'

マルツィオは、「わずかな素数を扱うと非常に圧縮性が高い」と言って、巧妙なヒントを残しました。「小さなビット」は偶然イタリック体ではないと確信していたので、16進文字列をビットに変換し、パターンを見つけようとしました。最初は、彼はすべての素数をビットとして表現し、それらを連結していると思っていましたが、うまくいきませんでした。それから多分数桁だけをとるか、ビット文字列のすべてのゼロを落とします-まだありません。たぶん、それは最初のいくつかの素数の最下位ビットのビット列でしょうか?そうでもない。しかし、最終的に私は働いたものを見つけました-それは最初のしかし多くの素数から2番目に重要でないビットのビットストリングです。

だから、私のコードはそれを行います:ちょうど十分な素数を生成し、それぞれの2番目のビットを取得し(i/2%2)、それらをバイナリ文字列として連結し、それをbase-10(int(..., 2))に変換してからbase-16(hex(...))に変換します。


1
すばらしいです!私はゴルフをコーディングするのは初めてですが、ハッシュは他の人が「どうやってそれをするか」を発見するのを楽しむ良い方法です。私は2日間待ってから、賞金を開きます(信頼に対して報酬を与えます:)。
マルツィオデビアシ14年

5
@MarzioDeBiasi:確かに動作します!または、賞金が支払われる前日に報酬を受け取ると言い、勝者が自分の答えを明らかにしなかった場合、2位が勝つなどと言う方がいいでしょう。 ?
クラウディウ14年

hashlibのコードがカウントされないのはなぜですか?出力を生成するために実行されているコードではありませんか?
フィルコルボーン14

2
@philcolbourn:いいえ、コードはhashlibを使用しません。sha256ハッシュを生成するだけなので、明日、これを最初に投稿したときにコードを書いたことを証明できます。明日会いましょう!
クラウディウ

@Claudiu:今、あなたはどのように問題をクラックしたのか説明してください!よくやった!
ルービック

9

ハスケル、105

SHA1ハッシュ: a24bb0f4f8538c911eee59dfc2d459194ccb969c

出力:

d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4ea59db3e7c94c4959ec94b3aa6c938f115a4d397582ecea24ccd32dc393384eb7a60dd2b5372354ad1b79aa6e495552945aa73a6ae9e452cd2d79adc612b5995bb47651174e94f39aa2e7156a55144d4e4aa35c2fab63ccb5a6a492968a2ec3d8889b8ca916f533225ba2e2cc1b27d4e8db17a43985caaa5b4f3624d3c6f694add70f7124e1b1c5ef65356c8dd71a871e25df5dc013b26f5a572898bd416604eda252c9ac83b36c567ed1c6cc534a62c559a9b2d4af22a5a9f4b2992332f8fbae486a8a9ab5467a36599f92d325b519bd8a4a4962a5e459fbe5baa235dda9361da9c96989776ab2342d1d2261c5c2661ce2767452a5d984b98aa6b514ec2958b2bc96161648f5c5bd2f321b3d4f4b2eb26b9ad932a44b5cbc92b7b32639fa422d64ed1a79494ca3b785b2a6e28cd95590e1a8874b60a6e1bac4bbec32397690a6b4c665796191aa3d54b7183d154b06db308a4d4aa135755d3bd998ac555b10ddb3e2ccf15eb32b5390b6ee2bac8f888d955a75df592d1c5a4ce8f4ea48b956dea09291a9154c55d5e93a768e04bae7b2aae9ab2ad62333453dc4e952e36a4750baafe4e591a314639526b38b4cbcaa5a927aabada6db532e97066dba3a66494d95d765c2aac31a92933fcac26c2b375513c9884a5c626ba6aeccde7294

編集:コード:

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文字

OK、それでは私の努力です:

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(...)*01つの文字を保存します。
pastebin.comスラッシュ0mr8spkT 14

@ace *額をたたく*ああ、なぜ私はそれを考えなかったのですか?? いつものようにエースに感謝します:
構いません

7

JS、764

この文字列をbase64と見なすと、un-base-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
「ダウンボートラッシュ」を回避するために、質問にいくつかの詳細を追加しました:-)
マルツィオ

4

マセトマティカ-56

謎はすでに解決されているので、アイデアを実装するだけです

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

いいね 私は、最短の可能性は、袋の猫のうちということになりましたが何であるか好奇心が強い
クラウディウ

「出力を印刷するために必要なライブラリを除く」ライブラリはありませんか?
ピーターテイラー14

@PeterTaylorうん、インポートなし-ライブラリなし。
スウィッシュ

コメントから判断すると、OPがそれを解釈するつもりだったとは思いません。
ピーターテイラー14

3

J-46文字

気にしないでください、後世のためにここでJゴルフを記録するだけです。トリックを理解するのに十分賢くありませんでした。

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

説明:

  • p:i.1007 4-0から1007行、4列の整数の行列を作成し、それらの整数に対応する素数を取得します。はい、p:Jビルトインです。はい、4つの素数が不足しています。

  • 2|<.-:-各数を半分にし(-:)、それを底にし(<.)、2を法とする(2|)。これは、リースの次に重要なビットを取得するのと同じです。

  • #.-結果の各行を基数2から整数に変換します。これにより、0〜15の1007個の数値が得られます。

  • '0123456789abcdef'{~#.-このビットマトリックスの各行を数値のバイナリとして取得し、その数値を使用して16進数のリストから選択します。これにより、4ビットごとに16進数に変換されます。

  • 1!:2&4-Jインタープリターには256文字を超える文字列の出力に問題があるため、このデータを直接stdoutに送信する必要があります。勝ち、負けます。

  • 4[-最後に、結果から結果を破棄し1!:2、代わりに出力から欠落している4を出力します。これは、最後の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でテスト済み。これは2つの観察結果を利用します:

  • Mathematica FromDigitsは与えられた数字の範囲を実際にはチェックしないので、それをフォームのリストに適用すると、に{2,0,2,2,0,...}適用するかのように結果が2倍になるだけ{1,0,1,1,0,...}です。しかし、それはまさにBitAnd素数に2を付けて生成された形式です。
  • 16進表現が必要な数値の最後のビットはゼロであるため(偶数で終わる文字列で証明されているように)、1つの素数で得られる数値の2倍になります。しかし、2倍の係数は、前の観測を使用して得られるものであるため、すべてが完全に適合しています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.