社会人になってから始めるTopCoder

これはCompetitive Programming Advent Calendarの11日目の記事です。
Advent Calendarには入門記事が意外となさそうなのと、自分自身初心者なので、紹介記事を書きます。

きっかけ

今年の4月から競技プログラミングをはじめました。「人材獲得作戦」や「コーディングスキル判定」をやってみたらめちゃくちゃ時間がかかったりして漠然とどうにかしたいなと思っていたところ、Google Code Jam勉強会というのを取引先の人から教えてもらい参加しました。問題が面白いし、あまりにもコードが書けないのでTopCoderに登録してそれ以来はまっています。

TopCoderとは

競技プログラミングは文字通りプログラミング能力を競うものです。TopCoder競技プログラミング環境を提供する会員制サービスで、要は、コーディングの速さと正確さを競うオンラインゲームです。
競技プログラミングサイトはいくつかありますが、以下の理由でTopCoderがお勧めです。

  1. 競技時間が比較的短い
    年をとると集中力が続かないので短いほうが良いです。
  2. 頻繁に開催される
    参加できる日は多いほうが良いです。
  3. 順位づけされる
    個人練習より刺激になります。
  4. 履歴が充実している
    問題の解説や、他の人が書いたコードを読むことができます。
  5. 参加者が多い
    色々な方法で解いている人を見つけることができます。

はじめかた

ユーザ登録して、プラグインをインストールすれば誰でも参加できます。こちらの記事が大変参考になります。

参戦するまでの流れですが

  1. ブラウザにJava Runtime(JRE)をインストールする
  2. http://community.topcoder.com/tc でユーザ登録する (例えば pokutuna氏の解説記事)
  3. 上のメニューの「Algorithm Competitions」からARENAを開いてログインする
  4. プラグインをダウンロードして設定する (こちらを参照)
    必須ではないですがおそらくほとんどの人が入れています
    なおTZTesterについては更新版のほうがお勧め (例えば nitoyon氏のもの)
  5. メニュー「Practice Rooms」から「SRMs」をクリックすると、部屋の一覧が出てくるので、適当な番号のDiv2というやつを選ぶ
  6. まんなかへんの「Coding Phase」の「Select one」の250を選ぶ
  7. 解いてsubmitする
  8. 2〜3問解いてみて感触がつかめたら、本番参戦
  9. 撃沈したら「プログラミングコンテストチャレンジブック」(通称蟻本)を買って読む

こんな感じです。
ちなみに「はてな」には「TopCoder部」というグループがあり、TopCoderの日記はそちらに書いています。

FAQ1 難しそう

Div2のEasyの問題は易しく作られていますので、がんばれば解けるかと思います。そのほかはまあ難しいです。でも楽しいです。
私は適当にぐぐって、当たって砕けろ的なゆるい感じではじめました。事前の準備を真面目に考えると、学ぶことが多すぎて尻込みしてしまうと思います。

FAQ2 英語が読めません

競技プログラミング(主にTopCoder)に参加しない理由」を見ると英語だから敬遠している人も多いようです。私も英文を読むのが得意ではなく、最初の2〜3回は問題文を読むのに10分くらいかかっていました。
これは慣れるしかないのですが、おそらく10回くらい参加するとどういう意図の問題なのかはなんとなくつかめるようになってきます。20回くらい参加しましたが、最近は英文であること自体がボトルネックになることは減ってきました。題意が何かをつかめない問題もあるのですが、たぶん日本語になっていても同じだと思います。
日本語でないといやだという方には、AOJという素晴らしいサイトがあります。

FAQ3 時間帯が合いません

TopCoderが開催されるのは、(1)平日の10:00から(2)深夜の01:00から(3)土曜日、が多いようです。平日の10:00は社会人には難しいと思いますが、プログラマであれば、勉強したいのでと上司にかけあってみるのも手かと思います。もし裁量労働であれば1時間くらい都合をつけるのは可能ではないでしょうか。

FAQ4 競技プログラミングって役に立つの

業務でのコーディングに直結することはあまりないかもしれません。でも楽しいです。
トレードオフを意識してコードを書くという点では業務のコーディングに近い面もあります。
100行くらいのコードで色々な問題が解けるというのが競技プログラミングの素晴らしいところで、エラー処理や保守性というような観点で見るものではありません。1000行の仕様書を読んで10000行のテストコードを書かなければいけないとしたら萎えますし。

FAQ5 学生に勝てません

学生には勝てません。Twitterを眺めていると、最近の学生はよく勉強していて優秀だなあというのがよくわかります。学生の知識の1/100くらいでも吸収できればだいぶ実力がつきます。

FAQ6 レッドコーダーってどのくらいすごいの

TopCoderではレーティング(≒実力)により色分けされていて、赤が最上位です。目安としては、色が一段階違うと、同じ問題を解く速さが2倍くらい違います。色が二段階違うと、質的に難しい問題に取り組んでいます。
私はこの前ようやく青くなりました。まだまだですね。
参考: Petr伝説

プログラミングの楽しみ

もし競技プログラミングが合わない方でも、楽しむのが目的のプログラミングはたくさんあります。

色々チャレンジしてみると楽しいと思います!