ポクポク

ポクッとしてツナッ

TopCoder:SRM410

id:blankblankの誘いでTopCoderに参加した!

TopCoderとは

Web上で、世界中のプログラマが参加するプログラミングコンテストを主催している企業。Google Code JamはTopCoderのシステムを利用して行われている

http://d.hatena.ne.jp/keyword/TopCoder

今回はそのTopCoderがほぼ毎週開催しているSRM(Single Round Match)に参加した。
細かいルールとかはアカウント作成の解説ついでに説明するとして、基本の流れが


問題に回答(3問:250/500/1000点問題、75分)
↓
休憩時間(5分)
↓
チャレンジフェイズ(15分)
↓
システムによる採点


で、特に面白いのがチャレンジングタイム。
同じ部屋(近いレートの20人)のコードを見ることができ、バグを見つけた! と思ったらバグを誘発しそうなデータを入力できる。仕様に沿わない出力をさせることができたら回答無効&指摘した人に+50点、ケチつけたのに正しい出力ならば指摘した人が-25点というルール。
他人のコードを読むのは勉強になるしバグを探すのが楽しい。


俺の点数は0点だったけどね!

適当に過去問(SRM405DIV2)を一つをやって「こりゃ1000点問題以外はいけるな」とたかをくくってたら、今回(SRM410DIV2)は250点問題すら回答できなかった。というより問題の意味が日本語で説明されてやっと分かったレベル。15歳のブルガリア人少年が短いコードでかっこよく解いててへこむ。うちの部屋は20人中13人が0点で8位でした。

フルに英語なので敷居は高めだけど、各問にExample(入力と出力と短い解説)が付いてるので意外と理解できるもんです。2軍問題なら比較的簡単に解けるので(といいつつ0点だったんだけど)みんな参加しようぜ! 俺は面白かったので時間が合う限り参加します。

TopCoderアカウント登録、SRM(Single Round Match)解説

なんかあんまり解説してるところ無いから俺が書く
ぜひユーザーが増えて欲しいので。

TopCoder

TopCoder - http://www.topcoder.com/
TopCoderはプログラミングコンテストを開催しているサイトです。賞金が付くコンテストや、企業への採用に結びつくなどの理由から、世界中から腕利きのプログラマが参加しています。
参加するプログラマは成績に応じてレーティングされ、レートが2200以上になるとユーザー名が赤くなりレッドコーダーと呼ばれ賞賛を集めます。
言語は英語のみですが、レートに応じて2つのDivisionに分けられているので、プログラミング初心者でも十分取り組める問題が用意されています。


とりえあずはアカウント登録の流れと、ほぼ毎週開催されているコンテスト、SRM(Single Round Match)について解説します。

TopCoderアカウント登録

TopCoderのウェブサイト右上の"Register Now"から登録します。
登録は6ステップに分かれていますが、個人情報を入力する2ステップ以外は簡単なもんです。

Select Your Registration

f:id:pokutuna:20080720063343p:image:w200:left
とりあえずプログラミングコンテストに参加したいだけなので、"Competition Registration"にチェックを入れてSubmit。

General

f:id:pokutuna:20080720063344p:image:w200:left
ユーザー情報を入力していきます。(*が必須項目)
(ログインIDとなるUserName以外はあとから変更できます。)
Given Name: 名前を入力。
Surname: 姓を入力。
Address1: 住所を入力。適当な文字列でも文句は言われません。
Timezone: 日本はリスト中央より少し下、Asia/Tokyoです。
Enable Member Contact: 他のユーザーからのコンタクトを受け取るならYes。
Show / hide earning: 稼いだ賞金の額を表示/非表示。見せびらかしてこそナンボです
Secret Question: パスワード忘れたときに聞かれるアレ。
Quote: ユーザー情報と一緒に表示されます。座右の銘でもエロゲの名台詞でもTwitterのつぶやきみたいに適当なこと書きましょう
Student / Professional: 学生か職業人か。ニートはしらん。



Demographics

f:id:pokutuna:20080720063345p:image:w200:left
Ethnic Background: 人種。
Primary Interest in TopCoder: TopCoderの何に惹かれたかを選択。
Shirt Size: Tシャツのサイズ。イベントとかで貰えます。たぶんアメリカンサイズなので小さめで。
College Major: 大学の専攻
College Major Description: 専攻についてちょろっと書きます。
Degree Program: 学部生や院生、博士課程とかを選択します。
Graduation Year: 大学を卒業予定の年。
Graduation Month: 卒業予定の月。
(この辺の質問はGeneralでStudentを選択したからかな)
Clubs / Organizations: 参加している団体等、無いならNone。
School: Choose Schoolのリンク先から学校名を検索し、選択。
Show / hide my school: ユーザー情報に学校名を表示/非表示。
GPA: なんか最近よくある成績評価の値を入力します。
GPA Scale: GPAの上限を選択します。優の上に秀とか作る大学とかが出てきたので、秀があるならたぶん上限は5.0。
How did you hear about TopCoder?: どこでTopCoderを知ったか選択し、入力します。

入力し終えたらSubmit。

Confirm

これで大体終了です。
入力した情報のが再度表示され、確認します。
General/Demographicsの横のEditで戻って編集できます。
問題ないならConfirm。

Success

f:id:pokutuna:20080720063346p:image:w200:left
この画面に飛びます。
入力したメールアドレスに認証用URLが送られるのでメールを開いてください。


だいたいこんなのが来るのでURLをクリック。

Thank you for registering with TopCoder! Your TopCoder activation code is ********** To activate your account, navigate to the following WWW URL:http://www.topcoder.com/reg/?module=Activate&code=********** If you cannot click on the web address above, please copy the address into your web browser to continue. If the address spans two lines, please make sure you copy and paste both sections without any spaces between them.

Activation

f:id:pokutuna:20080720063347p:image:w200:left
この画面に飛んだら、登録完了。
登録したアカウントでTopCoderのページからログインできます。


SRM(Single Round Match)

ほぼ毎週開催されているコンテスト、SRMについて説明します。SRMは250点、500点、1000点の3問の問題を75分で解答するコンテストです。解答が早ければ早いほど高得点です。どの問題からでも挑戦することができます。エントリーはコンテスト開始3時間前から5分前までArena(後述)で行えます。レーティングが1200以上のユーザーはDIV1、それ以外のユーザーはDIV2の問題を解くことになります。
SRMに限らず、コンテストの開催日は公式のカレンダー(アメリカ時間)から見ることができます。


SRMは4つのフェーズに分かれており、

Coding Phase(75分)

指定されたクラスとメソッドを作成し、各問題に解答する
言語はJava, C++, C#, VBから選択
プログラムの実行時間は2秒以下にしなければ不正解扱いになる
↓

Intermission(5分)

休憩時間
↓

Challange Phase(15分)

同じルーム(近いレートの20人1部屋)の参加者のコードを見ることができる
バグを誘発しそうな入力を「チャレンジ」し、
成功すると50点獲得&バグのあったコードが不正解に、失敗すると25点減点
↓

System Testing Phase(不定)

システムが厳密にコードをテストし、点が確定


TopCoderのコンテストは、エントリーからコーディング、コンパイル、解答提出などの流れをArenaというクライアントを用いて行います。また、既に終了したコンテストの"過去問"にも全て挑戦することができます。(ArenaはJavaが動作する環境が必要です)
f:id:pokutuna:20080720075644j:image:w200:left
トップページ左の"COMPETE"をクリック


f:id:pokutuna:20080720075640j:image:w200:left
左メニューの"Algorithm" => "Launch Arena" から起動


f:id:pokutuna:20080720075641j:image:w200:left
作成したアカウントのIDとPasswordでログインするとこの画面が表示される


f:id:pokutuna:20080720075642j:image:w200:left
SRMの過去問は"Practice Rooms"から選択、DIV1が1軍、DIV2が2軍問題


f:id:pokutuna:20080720075639j:image:w200:left
SRMでは、コンテスト開始3時間前からエントリー可能
"Active Contests" => "Register" でエントリー
開始5分前から"Enter"で振り分けられたルームへ移動可能


f:id:pokutuna:20080720075643j:image:w200:left
ルームへ移動するとこんな画面になる
赤枠で囲った部分に現在のフェイズが表示され、
青枠から問題選択
緑枠("Summary")から同じルームの人の解答状況が見れる、チャレンジもここから
黄枠("Chat Area")には、会話だけでなく、同じルームの人がコンパイルした、解答した、などの状況が表示される


f:id:pokutuna:20080720091044j:image:w200:left
問題を選択すると、この画面が表示される
使用する言語の選択、問題を読む、コンパイル、テスト、提出をここから行う
PythonはGoogleCodeJamのシステムに対応させるためのものらしいのでSRMで使える予定は無いっぽい
下のテキストエリアに指定されたクラス名、指定されたメソッド名のコードを記述していく
予約語、コメント等は色分けされるが、コード補完等の機能は無い


f:id:pokutuna:20080720080415j:image:w200:left
"Summary"を開くと、同じ部屋の参加者(コンテスト終了後は全ての参加者、画像は終了後)の解答状況を見ることができる
スコアの色は使用した言語を表していて、緑(Java)、黄(C++)、青(C#)、VBは見たこと無い
08/08/27追記: VBは水色でした
人口はC++が圧倒的に多い感じ


f:id:pokutuna:20080720080414j:image:w200:left
得点をクリックで、そのユーザーが提出したコードを見ることができる
左下の"Challenge"から、バグりそうな値を入力することでチャレンジできる
不正解を出力させるだけでなく、実行時間が2秒以上になる入力もチャレンジ成功になる
チャレンジするには他人のコードを読まなければならないので他言語も理解できる必要がある(VBだと攻撃されにくそうだ)


使い方は大体こんな感じです。
公式のカレンダーはアメリカ時間なので、GoogleカレンダーでTopCoderを検索し、公開カレンダーを作っている人にお世話になるのをお勧めします(現地時間が日本時間に変換されるため)。


必要に応じて適当に追記していきます。
間違い等お気づきの点がありましたらコメントでご指摘ください。


参考

http://vipprog.net/wiki/TopCoder.html
http://slashdot.jp/~line/journal/398304
http://www.itmedia.co.jp/enterprise/articles/0703/01/news013.html
http://kishibe.dyndns.tv/index.php?cmd=read&page=%E9%9B%91%E8%A8%98%2FTopCoder%E3%81%AB%E6%8C%91%E6%88%A6
http://4topcoder.blogspot.com/