More Related Content
Similar to 勉強か?趣味か?人生か?―プログラミングコンテストとは
Similar to 勉強か?趣味か?人生か?―プログラミングコンテストとは (20)
More from Takuya Akiba (10)
勉強か?趣味か?人生か?―プログラミングコンテストとは
- 2. 自己紹介
• 秋葉拓哉 (@iwiwi)
– 東京大学 修士 2 年 (博士進学予定)
– DB 系グラフアルゴリズムの研究
• プログラミングコンテストガチ勢
– TopCoder レーティング 3035 (いわゆるレッドコーダー)
– 世界的コンテストの決勝進出 10 回
– トップ 10 入り 4 回
銅メダル (2012) 世界 7 位 (2011) 世界 9 位 (2010)
日本人のメダルは 9 年ぶり 世界 9 位 (2009)
1
- 4. 今日の目標
プログラミングコンテストは
アツい!おもろい!
関心と理解を持ってもらう!
<学生> <先生> <社会人>
ちょっと 参加を 採用で評価
やろうかな? 促そうかな? してみるか?
3
- 5. プログラミングコンテスト紹介
プログラミングコンテストとは
「プログラミングでやるスポーツ」
• 開始と共に問題が出題される
• 問題を解くプログラムを作成する
• 時間内に,出来るだけ多く
問題 解く 順位
4
- 6. プログラミングコンテスト紹介
解答 問題
#include <iostream>
標準入力に,2 つの正整数が
int main() {
int a, b; 与えられます.
cin >> a >> b; その和を標準出力に出力して
cout << a + b << endl; ください.
return 0;
}
ジャッジサーバ
自動でコンパイル・テスト
即座に正誤判定・順位表更新
5
- 9. プログラミングコンテストの楽しさ
楽しい!!
頭がオカシイのでは?
言われたプログラム作るだけじゃん
世界中の人を惹きつけるに
( ゚д゚) 楽しいの?課題と何が違うわけ?
足る理由があります
8
- 10. プログラミングコンテストの楽しさ
• ゲーム的な楽しさ
– 時間制限の中で急いでプログラムを書く
– 即採点,即順位更新,リアルタイム
– インターネット越しに世界中の数千人と対戦
• 情報科学的な楽しさ
– アルゴリズムを考えるのが楽しい
– プログラミングが楽しい
9
- 11. プログラミングコンテストの楽しさ
• ゲーム的な楽しさ
– 時間制限の中で急いでプログラムを書く
– 即採点,即順位更新,リアルタイム
– インターネット越しに世界中の数千人と対戦
• 情報科学的な楽しさ
– アルゴリズムを考えるのが楽しい
– プログラミングが楽しい
10
- 12. 問題の例
• 𝑛 匹のアリが 1 cm/s で歩く
• 初期位置が入力される,向きを我々が決める
• ぶつかったら反対を向いて歩き出す
• 端まで行くと落っこちる
• アリが全滅するまでの時間を最大化したい
• 𝒏 ≤ 𝟏𝟎
11
- 24. 問題の例
全探索のアルゴリズム
全ての向きの候補に対してシミュレーションを
行い,最大の時間を求める
向きの候補は全部で 2 𝑛 通り
10匹なら…… 210 = 1024 通り
23
- 25. 問題の例
• 𝑛 匹のアリが 1 cm/s で歩く
• 初期位置が入力される,向きを我々が決める
• ぶつかったら反対を向いて歩き出す
• 端まで行くと落っこちる
• アリが全滅するまでの時間を最大化したい
• 𝒏 ≤ 𝟏𝟎
24
- 26. 問題の例 2
• 𝑛 匹のアリが 1 cm/s で歩く
• 初期位置が入力される,向きを我々が決める
• ぶつかったら反対を向いて歩き出す
• 端まで行くと落っこちる
• アリが全滅するまでの時間を最大化したい
• 𝒏 ≤ 𝟏000
25
- 27. 問題の例 2
全探索のアルゴリズム
全ての向きの候補に対してシミュレーションを
行い,最大の時間を求める
向きの候補は全部で 2 𝑛 通り
1000匹なら…… 21000 ≒ 10300 通り
天文学的数字 !
(宇宙の年齢 ≒ 4.3 × 1017 秒)
26
- 35. 問題の例 2
よく考えると,アリを区別する必要がない
34
- 38. プログラミングコンテストで問われるもの
アルゴリズム設計 のために必要なもの
大きく分けると 2 つ
1. 幅広い知識
– 基礎的なアルゴリズムの知識
• データ構造,グラフ,連立方程式,…
– 設計技法,その実例
• 動的計画法,貪欲法,ネットワークフロー,……
2. 柔軟な思考力・経験
– 実際にアルゴリズムを設計する
37
- 39. プログラミングコンテストで問われるもの
アルゴリズム設計 の知識を得る方法
• 大学の授業?有名な教科書?
– 知識についてのみカバーされる
• 本「アルゴリズムデザイン」
– 設計技法について詳しく扱う珍しい本
• アルゴリズムの適用法,組合せ方
• 細かいテクニック
• 少し進んだアルゴリズム
こういった物を知るには昔は苦労がつきなかったが……!
38
- 40. プログラミングコンテストで問われるもの
プログラム実装 のために必要なもの
• 実装に関する能力
– スラスラと書く
• 言語への慣れ,見通し
– コンパクトに書く
• 標準ライブラリの活用,抽象化
– 正確に実装する
• 間違いやすい部分に気づく,無理に短くしない
• デバッグに関する能力
– すぐに間違っている部分を特定する
– デバッグしやすいテストケースを考える
39
- 41. プログラミングコンテストで問われるもの
プログラム実装 のために必要なもの
• 実装が楽なアルゴリズムを選択する
– アルゴリズムを思いついても,満足しない
– もっと簡単に実装できる別解を探る
– 制約が緩ければ,逆に計算量や精度が悪くし
てでもシンプルにして実装を楽に
40
- 49. プログラミングコンテスト
Google Code Jam
• Google の開催するコンテスト
• 世界中から 10000 人以上が参加
TopCoder
• インターネットで定期的に開催される
• 参加者にはレーティングが付き評価される
• 毎年 1 度,アメリカで世界大会
48
- 52. プログラミングコンテストの真相 1
どのコンテストが一番凄いの?
• 現在 ACM-ICPC の知名度・評価がダントツ
– 歴史がある?
– 規模が大きい?
• これに僕は異議を唱えたい!
• 他の世界的コンテストも知って,それらでの戦
果も正当に評価してほしい!
51
- 53. プログラミングコンテストの真相 1
どのコンテストが一番凄いの?
ACM-ICPC の最大の問題点:歪んだルール
• 大学,地域ごとの格差がメチャクチャ
• 例えば,大学ごとに進出校数制限
• 東大からの世界大会進出は超絶大変
• 他校の世界大会進出チームは,東大の敗退チー
ムより下位なことがよくある
– 従って,「世界大会進出」の背景が全然違う
また,年齢制限・回数制限なども厳しいため,例
えば優勝者が本当に時点最強と言えない
52
- 54. プログラミングコンテストの真相 1
どのコンテストが一番凄いの?
一方で,世界的なインターネット予選で純粋に上
から選抜されるシステムは超公平
• TopCoder Open
– ほぼ全人類が参加可! (スタッフ以外)
• Google Code Jam,Facebook Hacker Cup
– 社員以外参加可!
ただし 18 歳以上
53
- 55. プログラミングコンテストの真相 1
どのコンテストが一番凄いの?
ACM-ICPC の他の問題点
• 問題が面白くない
– アルゴリズム的な面白さが重視されていない
– 実装するだけの問題ばかり
• 問題の準備が適当
– 世界大会でも入力データにミス (最近だと 2007 年問題 J)
– しかも無視し結果はそのまま,公式サイトには情報なし
– 当時の掲示板カキコで見れる http://bit.ly/RZGqfE
54
- 56. プログラミングコンテストの真相 1
どのコンテストが一番凄いの?
ACM-ICPC は裾野が広いのが素晴らしい
• 大学対抗,年に 1 回
• ACM が後援で先生方も応援してくれる
• 予選は問題も日本語
• 予選を突破すると日本の地区予選に行ける
– トップ 100 人ぐらい
– 他の大会では旅行が伴うのはかなり上のみ
参加の価値は依然として高い
55
- 57. プログラミングコンテストの真相 2
「レッドコーダー」は本当に凄い?
レッドコーダーとは?
• TopCoder では,レーティング (評価値) に応じて,
名前に色がつく
• レーティングが 2200 に到達し赤色になった人のこと
56
- 58. プログラミングコンテストの真相 2
「レッドコーダー」は本当に凄い?
• 世界に約 300 人,上位 3 %に相当
• 日本には現在 26 人
– ちなみに,俺がはじめた頃は 4 人とか
– 本当に神だと思って憧れてた,崇めてた
– 信じられないような速度・正確性
– 安定した上位
– 自分がそうなれる日が来ると思ってなかった
57
- 59. プログラミングコンテストの真相 2
「レッドコーダー」は本当に凄い?
……でも実はもっと遥かに凄い集団が!!!
その名も「ターゲット」
• レーティングが 3000 に到達した人のこと
• 名前の左側のインジケータが満タンになる
– 射的の的(=ターゲット)になる
↓ レッドコーダー (溜りかけ)
• 世界に 18 人,上位 0.2%!
– レッドコーダー (= 上位 3%) のさらに上位 6%
↓ ターゲット(満タン)
• 日本には 3 人!
– lyrically, wata, 俺 (+ rng_58)
58
- 60. プログラミングコンテストの真相 3
トップ選手はどのように育つ?
• コンテストにおける実力の差は絶大
– トップ層は安定して常に上位をとり続ける
• トップの中のトップ選手
やってる人で知らない人は居ない.普段1位を取っても誰も驚かない.)
– 3位:Petr (ロシア, 現 3489, 最高 3923)
• 落ち着きがヤバイ.着実な感じ.
– 2位:ACRush (中国, 現 3511, 最高 3902)
• 勢いがヤバイ.怖い.結構ミスってオモロイ.
– 1位:tourist (ベラルーシ, 現 3583, 最高 3656)
• 最近では人類最強,何とまだ高校生…
59
- 62. プログラミングコンテストの真相 3
トップ選手はどのように育つ?
そこまでじゃなくても,世界大会に進出していく
ようなトップ層はどうやって生まれる?
修行あるのみ!!
問題を解きまくる!!
61
- 64. プログラミングコンテストの真相 3
トップ選手はどのように育つ?
• 闇雲に解けば良いという物ではない
– 丁度いい難易度&質の良い問題
– ただ解くだけじゃなく,最大限に知見を得る
• 仲間の存在が重要かも?
– 解法や実装についての議論
– アイツに差をつけるんだ!って解きまくる
– 俺は岩田,北川(アリ本の人たち)とかなり一
緒にやってた
63
- 65. プログラミングコンテストの真相 4
日本はなぜ強豪国に?
• 現在,日本は国別ランク 4 位
– 特に東京大学は大学ランク 1 位 (冒頭)
– 一方,僕がはじめた 5 年前はトップ 10 圏外
• 一体何が起きたのか?
64
- 66. プログラミングコンテストの真相 4
日本はなぜ強豪国に?
• コミュニティ形成・拡大
– コンテストをやる人自体が増えた
– テクニックや知識も簡単に手に入る
• 強者登場 → 憧れて練習,の良い循環
努力だけなら一人でもできる? → ×
トップ層は,かなりの時間をコンテストに捧げる
割り切った生活になる.心強さが全然違う.
65
- 67. プログラミングコンテストの真相 5
コンテスト勢の得意と不得意は?
基本的にはコンテストで問われるか否か
• 得意
– アルゴリズム
– プロトタイピング
– ややこしいルーチンの正確な実装
• 苦手
– 大規模なソフトウェアの設計・実装・メンテ
• コンテスト以外でこういうそういうことをやっている人も居
るとは思います
66
- 69. プログラミングコンテストの真相 6
勉強か?趣味か?人生か?
もちろん全部!
(ありきたりな答えですみません……)
• 勉強!
– 色々な能力が間違いなくついた
• 趣味!
– ちょー楽しい
• 人生!
– 一時期は熱中していて,本当にコンテスト=人生
– そうじゃない今でも,人生への影響は絶大
• コンテスト好きをこじらせてアルゴリズム研究
• かけがえのない人間関係や機会,経験
68