4DM.org

トップ / PKU / D言語 / グラフ理論 / ステレオグラフィックス / Cozy Ozy / アンテナ / リンク / ダウンロード / プロフィール


伝説の1145 - Tree Summing -

「コードを短くするのって楽しいですよね?」というtanakhさん(http://d.hatena.ne.jp/tanakh/)の日記に始まり、あのスーパープログラマやねうらおさんが煽ることから一気にヒートアップ。どんどん短縮されるコード、明かされる超絶テクニック、とんでもない結末。。。たった一問の問題に数多くのプログラマが挑み、恐ろしいほど大量の時間と才能を浪費したこの戦いの記録を、ここに書き残す。こんなアホなことが起こらないように(という気持ちとまた祭りがあったら楽しいかも)という気持ちを半分ずつ込めて・・・。



 1.Tree Summingって、どんな問題? (やねうらおさんの日記1より)

最初は、普通に木の問題として考えられていた。

 2.スタックを用いた基本的な解法解説やサンプルコード(やねうらおさんの日記2より)

 3.稲葉さんの分かりやすいコードを引用し、再帰によるサンプルコードと当時最短であった108byteのコードを公開(やねうらおさんの日記3より)

このころ、私Ozyも仕事の息抜きにと、やねさんの煽りに乗っかってみた・・・が間違いコード(;´д`)


おそらくこれ以上短縮しても、100バイトちょっとだろうと考えられていたところで、やねうらおさんがとんでもない記録をたたき出す

4.100byte切ってます(^^;)(やねうらおさんの日記4より)

http://www.taniguchitomoya.com/diary/?date=20051125#p01
ここでインプット解析を途中までやっていた人がいたのですが、やねさんがなんとこれを完璧にやってしまいました。

 5.インプット解析の手法1(やねうらおさんの日記5より)
 6.インプット解析の手法2(やねうらおさんの日記6より)

当時私も参加中で、やねさんが大量のコードを送信しているのを見て「あ、何かやらかすな・・・」と思ってたら案の定。スゴイ。。。ちなみに私はどうやってインプットデータを入手したかというと、
http://www.inf.bme.hu/contests/tasks/
ここにPKUで使用されているデータと全く同じもの(の一つ)を発見しました。インプットは2種類あって片方だけなので、もう片方は自分で調べました。

 

これで一通り落ち着くのかと思われましたが、答えが分かっていたとしても
@解答データをいかに少ない文字数で保存するか
Aどのような出力方法にするのか
という点で、熱い戦いが繰り広げられたのです

いつも後手後手で追いかけていた私ですが、ついにトップを取ることに成功しました。きっかけは、
 7.3進数を使うというものでした(Ozyの日記より)

 8.そして神の領域へ1(やねうらおさんの日記7より)
 9.そして神の領域へ2(やねうらおさんの日記8より)
10.そして神の領域へ3(やねうらおさんの日記9より)

ここでも語られているように、最後は確率的な方法まで導入されました。

11.コードが通る確率1(Ozyの日記より)
12.コードが通る確率2(Ozyの日記より)
13.コードが通る確率3(Ozyの日記より)
14.爆撃テスト(Ozyの日記より)

そんなこんなで、ついに(実際に通った)最短コードが61byteであるということがわかりました。

15.そして伝説へ1(やねうらおさんの日記10より)
16.そして伝説へ2(やねうらおさんの日記11より)

「めでたしめでたし」という雰囲気になり、やねさんの日記はフィナーレを向かえ、私もそれまでの奮闘を振り返った。

17.やねうらおさんの日記12
18.Ozyの日記

 

・・・と余韻に浸るまもなく、事件が起こる。

19.祭りはつづくよどこまでも(Ozyの日記より)

が、事件を起こしたのがやねさんトコの社員さんであることが幸いだった。
20.セキュリティホール(やねうらおさんの日記13より)
21.セキュリティホール(やねうらおさんの日記14より)
22.セキュリティホール(やねうらおさんの日記15より)
23.セキュリティホール詳細(Ozyの日記より)

 

日記では、これで完結している。
しかし私はあることに気付いた。それは、現在のPKU1145 statusである。
http://acm.pku.edu.cn/JudgeOnline/problemstatus?problem_id=1145追記参照
最初に25byteを出したはずのsumireさんが27byteになっている。
もしや、セキュリティホールがまだ完全に塞がっていなかったのか!?
その真相はわからない。一体誰が、どうやって・・・


PKU1145祭り〜その後(2006.07.09追記)

この記録をsumireさんが目にしたようで、以下のようなコメントを頂きました。

27 Byte というのは私が 25 Byte の前にミスで出した記録です。

(25 Byte + ¥r¥n) 恐らく最後に Submit した記録だけ削除されたのでしょうね。

というわけで、sumireさんが削除依頼を出されただけということが判明しました^^;
実は、sumireさんは他にもセキュリティホールを見つけているようで、その気になれば
サーバごと乗っ取れそうな勢いですw尊敬。
そんなsumireさんの日記も紹介しておきましょう。
http://d.hatena.ne.jp/O-saka/


ところで、今のPKU1145問題はどんなランキングになっているのでしょうか。

トップはnamasuteさんの106B。一体どんな超絶コードなのか・・・。
というわけで、私Ozyがnamasuteさん本人に聞いてきました。
これが1位の最短コード106Bだ!!

y,s;
main(p,n){
  for(;1&~getchar(y*=scanf("%d ",&s)?n-=p?y=n-s:s,s=3:--s|n);p&&puts(y?"no":"yes"))
    main(0,n);
}

本人曰く、「インチキコードです」とのことだが、ReJudgeで生き残ったということは正当なコードと見なして良いでしょう。

スバラシイっす(>_<)


presented by Ozy [ozy@4dm.org]