カメヲラボ

主にプログラミングとお勉強全般について書いてます

コードが通る確率(下)

60byteを切ることは出来るのか。

59byteへの挑戦

wajさんの発見した、time(0)で0を省略する方法を使えば夢の59byteが見えてくる。まず、私が書いたコード。


main(n){n=time()%'XXXX'+82;for(n/=3;puts(n&2?"yes":"no"));}
XXXXは何だったか忘れた^^;仕事場に忘れてきたので、後で追記します。0x16524501。
まあそれは良しとして、コイツがAcceptされる確率を考えると、'XXXX'は約3億8千万。380000000÷60÷60÷24÷365≒12年に一度ぐらいAcceptされるチャンスがやってくる。もちろん、これは単なる「チャンス」なわけで、前々回書いた通り、time()でうまくいく可能性は100回に一度くらいなので、12年周期で100回、1200年程頑張ったら通るかもしれない。平安時代ぐらいから頑張っていれば今頃神になっていたことだろう。長生きに自信のある人は頑張ってみてほしい(笑)


と、ネタで落とそうと思っていたのだが、wajさんのもうひとつの発見。2.5進表現でひとつ可能性が見えた。wajさんのコードを少し変形すると、


main(d){for(d=time()%'XXX'+90;d*=.4;)puts(d&2?"no":"yes");}
2.5進法を使うと、小さいほうの値を2桁に抑えつつ、文字リテラルの値を大幅に抑えることが出来る。その値約800万。
8000000÷60÷60÷24÷365≒0.25年(=3ヶ月)
0.25年×100回=25年。25年に一度通るとすれば、長生きさんでなくても十分通すことは可能である。


もちろん、これは25年間デタラメに送信してもうまくいかない。まず、自分のマシンでtime(0)%'XXX'の値を調べて、あと何時間後にチャンスがやってくるのか調べておく。日本と北京大学の時差は約1時間。日本でチャンスになる時間の約1時間後が勝負だ。これを3ヶ月毎にやっていけば、夢の59byteが達成されるのだ。