天下一プログラマー2009/06/19

天下一プログラマーコンテスト via MEMOはてな支店

名前が素敵。 ってのはともかく、今一ターゲットが不明。 提示されている例題を含めての話。

天下一

天下一なんて冠をつけたからには(うちのSKKのJIS-L辞書には入ってない単語だけど、多分DBを意識しているんだよね?)geek方面を意識しているんだと思う。

で、実際

審査基準
 1. 出題通りに正しく動作するか
 2. 所要時間
 3. コードのエレガントさ

とあるわけだけど、これで例題が

以下の文字列はUTF-8を文字エンコーディング形式とする16進数のバイト列である。
UTF-8でエンコーディングされた文字列として解析した場合、
この文字列の【文字数】を答えなさい。

e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97
e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e381
99e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082

ってのは何か違うんじゃないかなあ。

こんな問題に "出題通りに正しく動作するか" 悩んだり、 "所要時間" が計測可能な程時間を掛けたりする "天下一プログラマー" は居ないよ。

"コードのエレガントさ" に関しても、主題に頭を使う部分が全くないので、小手先のそれこそGolf的な凝り方しかすることがないと思う。 んで、(個人的にGolfは好きだけど)これも "天下一プログラマー" の要件では無い。

  • バイト列が実はUTF-8符号化として正しくないとか
  • 幅無しの空白文字が含まれていてこいつの「文字数」は0なのか1なのかとか
  • 解答に与えられる時間が秒単位だとか

ぐらいの制限なりひっかけなりが無いと、コンテストとしての面白みに欠けると思うけど、どうだろう?

蛇足

あと、細かいところだと"16進数のバイト列"って表現もおかしい。 "バイト列の16進数表記"ぐらいなら我慢もできるけど。

"以下の文字列は、ある文字列をUTF-8で符号化したオクテットストリームを16進数表記にしたものである。" が正しいと思う。

ちなみに、僕の解答は

p <<EOT.gsub(/(.)./){$1}.tr("8-b\n",'').size
e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97
e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e381
99e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082
EOT

#=> 41

こんな感じ。

MEMOはてな支店 ここの最初の例と全く同じですね。

(追記)

この手の問題をわんこそば形式でひたすら解いていき、一定時間内の正答数を競うコンテストはそれなりに面白いかも。

と思ったけど、それってなんて Project Euler