TopCoderで求められているのは何なのか

ふと思ったので。以下、TopCoderのAlgorithm Competitionについて。


この競技は数ある短時間系プログラミングコンテストの中でも群を抜いて短いコーディング時間なので、"速く解くこと"が主眼に置かれていると思われがちだと思う。実際、アリーナの1時間15分のカウントダウン表示が結構なプレッシャーになっているのは事実で、ぼくも今でもあの表示が30分を切ったあたりでだんだん焦ってくるのだけど。


しかし、実のところあの競技の主眼は速さではなくて、正確さに置かれていると思う。


というのは、この競技の最大の特徴だと僕が思っているルール、バグが一つでもあればそのプログラムに対する点数がゼロになってしまう"All or Nothing"の採点方式があるから。これがあるおかげで、どんなに速くコードを書き上げて高得点で提出してもバグっていればそのコードに意味はなくなってしまう。しかも、バグの検出はチャレンジもしくはシステムテストで行われるわけだけど、もしチャレンジで落とされなかったとしてもTopCoderシステムテストは重箱の隅をつつくようなコーナーケースをきっちり用意してくるので、バグがあったらまず確実に通らないようになっている。


だから、この競技で勝つためには、まず正しいアルゴリズムをちゃんと考えること。与えられた問題サイズや拘束条件をしっかり把握した上で、それに見合ったアルゴリズムを論理のほつれが無いように構築することが一番大事だと思う。

それが出来た上で、次はそのアルゴリズムを正しくコードに落とすことが要求される。この競技では実装に100行以上もかかるような問題はほとんど出題されない。それに、がりがりと愚直にコーディングしたほうが速いように思われるかもしれないけど、デバッグの手間を考えると結局これもコンパクトで読みやすいコードを書いたほうがトータルで時間が短くなることが多い。ここでも速さより正確さを重視したほうが良い結果が出ると思う。

この2つさえちゃんと出来ればそれだけで良い順位に食い込めるようになっているんだと思う、この競技は。


もちろん、スピードは全く要求されていないのかというと、そういうわけでもない。最低限のタイピングはできなきゃいけないだろうし、使うプログラミング言語の文法をちゃんと知らなくてコンパイルエラーがなかなか取れないようでは困る。それに、言語に付属する標準ライブラリの使い方を最低限基本的なものだけでも知っておくことは結構重要で、たとえばソートを自分で毎回書いているようでは時間を浪費してしまう。標準ライブラリはプログラミングの生産性を上げる道具という意味で言語の一部分なので、ちゃんとおさえておきたい。

でも、そういう最低限のことをクリアすれば、あとは正確さに尽きる。そう思う。