勉強か?趣味か?人生か?―プログラミングコンテストとは

69
2012/09/16 情報科学若手の会 勉強か?趣味か?人生か? プログラミングコンテストとは 東京大学 修士 2 秋葉 拓哉

Upload: takuya-akiba

Post on 24-Jun-2015

30.752 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 勉強か?趣味か?人生か?―プログラミングコンテストとは

2012/09/16 情報科学若手の会

勉強か?趣味か?人生か?

プログラミングコンテストとは

東京大学 修士 2 年

秋葉 拓哉

Page 2: 勉強か?趣味か?人生か?―プログラミングコンテストとは

自己紹介

• 秋葉拓哉 (@iwiwi)

– 東京大学 修士 2 年 (博士進学予定)

– DB 系グラフアルゴリズムの研究

• プログラミングコンテストガチ勢

– TopCoder レーティング 3035 (いわゆるレッドコーダー)

– 世界的コンテストの決勝進出 10 回

– トップ 10 入り 4 回

1

世界 7 位 (2011) 世界 9 位 (2010) 銅メダル (2012) 日本人のメダルは 9 年ぶり 世界 9 位 (2009)

Page 3: 勉強か?趣味か?人生か?―プログラミングコンテストとは

自己紹介

プログラミングコンテストチャレンジブック

2

累計一万部突破 韓国・台湾の翻訳版 (中国版も翻訳中)

Page 4: 勉強か?趣味か?人生か?―プログラミングコンテストとは

今日の目標

3

プログラミングコンテストは アツい!おもろい!

<学生> ちょっと

やろうかな?

<先生> 参加を

促そうかな?

<社会人> 採用で評価 してみるか?

関心と理解を持ってもらう!

Page 5: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテスト紹介

プログラミングコンテストとは

「プログラミングでやるスポーツ」

• 開始と共に問題が出題される

• 問題を解くプログラムを作成する

• 時間内に,出来るだけ多く

4

問題 解く 順位

Page 6: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテスト紹介

自動でコンパイル・テスト

即座に正誤判定・順位表更新

5

標準入力に,2 つの正整数が与えられます. その和を標準出力に出力してください.

#include <iostream> int main() { int a, b; cin >> a >> b; cout << a + b << endl; return 0; }

問題 解答

ジャッジサーバ

Page 7: 勉強か?趣味か?人生か?―プログラミングコンテストとは

6

プログラミングコンテストの楽しさ

頭がオカシイのでは? 言われたプログラム作るだけじゃん 楽しいの?課題と何が違うわけ? ( ゚д゚)

Page 8: 勉強か?趣味か?人生か?―プログラミングコンテストとは

頭がオカシイのでは? 言われたプログラム作るだけじゃん 楽しいの?課題と何が違うわけ?

7

プログラミングコンテストの楽しさ

( ゚д゚)

Page 9: 勉強か?趣味か?人生か?―プログラミングコンテストとは

頭がオカシイのでは? 言われたプログラム作るだけじゃん 楽しいの?課題と何が違うわけ?

8

プログラミングコンテストの楽しさ

( ゚д゚)

楽しい!! 世界中の人を惹きつけるに 足る理由があります

Page 10: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの楽しさ

• ゲーム的な楽しさ

– 時間制限の中で急いでプログラムを書く

– 即採点,即順位更新,リアルタイム

– インターネット越しに世界中の数千人と対戦

• 情報科学的な楽しさ

– アルゴリズムを考えるのが楽しい

– プログラミングが楽しい

9

Page 11: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの楽しさ

• ゲーム的な楽しさ

– 時間制限の中で急いでプログラムを書く

– 即採点,即順位更新,リアルタイム

– インターネット越しに世界中の数千人と対戦

• 情報科学的な楽しさ

– アルゴリズムを考えるのが楽しい

– プログラミングが楽しい

10

Page 12: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

• 𝑛 匹のアリが 1 cm/s で歩く

• 初期位置が入力される,向きを我々が決める

• ぶつかったら反対を向いて歩き出す

• 端まで行くと落っこちる

• アリが全滅するまでの時間を最大化したい

• 𝒏 ≤ 𝟏𝟎

11

Page 13: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

12

0 1 2 3 4 5 6 7 8 9 10

t = 0

Page 14: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

13

0 1 2 3 4 5 6 7 8 9 10

t = 1

Page 15: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

14

0 1 2 3 4 5 6 7 8 9 10

t = 2

Page 16: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

15

0 1 2 3 4 5 6 7 8 9 10

t = 2

Page 17: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

16

0 1 2 3 4 5 6 7 8 9 10

t = 3

Page 18: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

17

0 1 2 3 4 5 6 7 8 9 10

t = 3

Page 19: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

18

0 1 2 3 4 5 6 7 8 9 10

t = 4

Page 20: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

19

0 1 2 3 4 5 6 7 8 9 10

t = 5

Page 21: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

20

0 1 2 3 4 5 6 7 8 9 10

t = 6

Page 22: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

21

0 1 2 3 4 5 6 7 8 9 10

t = 7

Page 23: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

22

0 1 2 3 4 5 6 7 8 9 10

t = 8

Page 24: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

全探索のアルゴリズム

全ての向きの候補に対してシミュレーションを行い,最大の時間を求める

向きの候補は全部で 2𝑛 通り

10匹なら…… 210 = 1024 通り

23

Page 25: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例

• 𝑛 匹のアリが 1 cm/s で歩く

• 初期位置が入力される,向きを我々が決める

• ぶつかったら反対を向いて歩き出す

• 端まで行くと落っこちる

• アリが全滅するまでの時間を最大化したい

• 𝒏 ≤ 𝟏𝟎

24

Page 26: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例 2

• 𝑛 匹のアリが 1 cm/s で歩く

• 初期位置が入力される,向きを我々が決める

• ぶつかったら反対を向いて歩き出す

• 端まで行くと落っこちる

• アリが全滅するまでの時間を最大化したい

• 𝒏 ≤ 𝟏000

25

Page 27: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例 2

全探索のアルゴリズム

全ての向きの候補に対してシミュレーションを行い,最大の時間を求める

向きの候補は全部で 2𝑛 通り

1000匹なら…… 21000 ≒ 10300 通り

天文学的数字 !

(宇宙の年齢 ≒ 4.3 × 1017 秒)

26

Page 28: 勉強か?趣味か?人生か?―プログラミングコンテストとは

27

Page 29: 勉強か?趣味か?人生か?―プログラミングコンテストとは

28

Page 30: 勉強か?趣味か?人生か?―プログラミングコンテストとは

29

Page 31: 勉強か?趣味か?人生か?―プログラミングコンテストとは

30

Page 32: 勉強か?趣味か?人生か?―プログラミングコンテストとは

31

Page 33: 勉強か?趣味か?人生か?―プログラミングコンテストとは

32

Page 34: 勉強か?趣味か?人生か?―プログラミングコンテストとは

33

Page 35: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例 2

よく考えると,アリを区別する必要がない

34

Page 36: 勉強か?趣味か?人生か?―プログラミングコンテストとは

問題の例2

衝突を考える必要が実は全くない!

効率の良いアルゴリズム

各アリから遠い方の端までの距離の最大値

𝑂(𝑛) 時間しかかからない

1000匹居ても超余裕!

35

Page 37: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

36

問題

アルゴリズム設計

プログラム実装

アルゴリズム設計とプログラミングの複合競技

Page 38: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

大きく分けると 2 つ

1. 幅広い知識

– 基礎的なアルゴリズムの知識

•データ構造,グラフ,連立方程式,…

– 設計技法,その実例

•動的計画法,貪欲法,ネットワークフロー,……

2. 柔軟な思考力・経験

– 実際にアルゴリズムを設計する 37

アルゴリズム設計 のために必要なもの

Page 39: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

• 大学の授業?有名な教科書?

– 知識についてのみカバーされる

• 本「アルゴリズムデザイン」

– 設計技法について詳しく扱う珍しい本

• アルゴリズムの適用法,組合せ方

• 細かいテクニック

• 少し進んだアルゴリズム

こういった物を知るには昔は苦労がつきなかったが……!

38

アルゴリズム設計 の知識を得る方法

Page 40: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

• 実装に関する能力

– スラスラと書く

• 言語への慣れ,見通し

– コンパクトに書く

• 標準ライブラリの活用,抽象化

– 正確に実装する

• 間違いやすい部分に気づく,無理に短くしない

• デバッグに関する能力

– すぐに間違っている部分を特定する

– デバッグしやすいテストケースを考える

39

のために必要なもの プログラム実装

Page 41: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

• 実装が楽なアルゴリズムを選択する

– アルゴリズムを思いついても,満足しない

– もっと簡単に実装できる別解を探る

– 制約が緩ければ,逆に計算量や精度が悪くしてでもシンプルにして実装を楽に

40

のために必要なもの プログラム実装

Page 42: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

41

問題

アルゴリズム設計

プログラム実装

アルゴリズム設計とプログラミングの複合競技

Page 43: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストで問われるもの

42

問題

アルゴリズム設計

プログラム実装

アルゴリズム設計とプログラミングの複合競技

やらない人には意外な事実?

この部分の方が差がつく

アルゴリズムの方が難易度の幅が大きい 強い人には一瞬でも, 苦手な人はいつまで経っても解けなかったり

Page 44: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの 真相!

43

Page 45: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 1

まずは色々なコンテストを紹介!

44

どのコンテストが一番凄いの?

Page 46: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテスト

ACM/ICPC

• 大学対抗プログラミングコンテスト

• 1970 年開始,最も歴史がある

• 世界約 2000 大学から 20000 人以上が参加!

• 3 人 1 チームのチーム戦

45

Page 47: 勉強か?趣味か?人生か?―プログラミングコンテストとは

46

アジア地区大会 東京サイト (2009)

Page 48: 勉強か?趣味か?人生か?―プログラミングコンテストとは

47

世界大会 (2009 中国ハルビン)

Page 49: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテスト

Google Code Jam

• Google の開催するコンテスト

• 世界中から 10000 人以上が参加

TopCoder

• インターネットで定期的に開催される

• 参加者にはレーティングが付き評価される

• 毎年 1 度,アメリカで世界大会

48

Page 50: 勉強か?趣味か?人生か?―プログラミングコンテストとは

49

TopCoder Open 2011

Page 51: 勉強か?趣味か?人生か?―プログラミングコンテストとは

50

TopCoder Open 2011

Page 52: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 1

• 現在 ACM-ICPC の知名度・評価がダントツ

– 歴史がある?

– 規模が大きい?

• これに僕は異議を唱えたい!

• 他の世界的コンテストも知って,それらでの戦果も正当に評価してほしい!

51

どのコンテストが一番凄いの?

Page 53: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 1

ACM-ICPC の最大の問題点:歪んだルール

• 大学,地域ごとの格差がメチャクチャ

• 例えば,大学ごとに進出校数制限

• 東大からの世界大会進出は超絶大変

• 他校の世界大会進出チームは,東大の敗退チームより下位なことがよくある

– 従って,「世界大会進出」の背景が全然違う

また,年齢制限・回数制限なども厳しいため,例えば優勝者が本当に時点最強と言えない

52

どのコンテストが一番凄いの?

Page 54: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 1

一方で,世界的なインターネット予選で純粋に上から選抜されるシステムは超公平

• TopCoder Open – ほぼ全人類が参加可! (スタッフ以外)

• Google Code Jam,Facebook Hacker Cup

– 社員以外参加可!

ただし 18 歳以上

53

どのコンテストが一番凄いの?

Page 55: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 1

ACM-ICPC の他の問題点

• 問題が面白くない

– アルゴリズム的な面白さが重視されていない

– 実装するだけの問題ばかり

• 問題の準備が適当 – 世界大会でも入力データにミス (最近だと 2007 年問題 J)

– しかも無視し結果はそのまま,公式サイトには情報なし

– 当時の掲示板カキコで見れる http://bit.ly/RZGqfE

54

どのコンテストが一番凄いの?

Page 56: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 1

ACM-ICPC は裾野が広いのが素晴らしい

• 大学対抗,年に 1 回

• ACM が後援で先生方も応援してくれる

• 予選は問題も日本語

• 予選を突破すると日本の地区予選に行ける

– トップ 100 人ぐらい

– 他の大会では旅行が伴うのはかなり上のみ

参加の価値は依然として高い

55

どのコンテストが一番凄いの?

Page 57: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 2

レッドコーダーとは?

• TopCoder では,レーティング (評価値) に応じて,名前に色がつく

• レーティングが 2200 に到達し赤色になった人のこと

56

「レッドコーダー」は本当に凄い?

Page 58: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 2

• 世界に約 300 人,上位 3 %に相当

• 日本には現在 26 人

– ちなみに,俺がはじめた頃は 4 人とか

– 本当に神だと思って憧れてた,崇めてた

– 信じられないような速度・正確性

– 安定した上位

– 自分がそうなれる日が来ると思ってなかった

57

「レッドコーダー」は本当に凄い?

Page 59: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 2

……でも実はもっと遥かに凄い集団が!!!

その名も「ターゲット」

• レーティングが 3000 に到達した人のこと

• 名前の左側のインジケータが満タンになる

– 射的の的(=ターゲット)になる

• 世界に 18 人,上位 0.2%! – レッドコーダー (= 上位 3%) のさらに上位 6%

• 日本には 3 人! – lyrically, wata, 俺 (+ rng_58)

58

「レッドコーダー」は本当に凄い?

↓ レッドコーダー (溜りかけ)

↓ ターゲット(満タン)

Page 60: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 3

• コンテストにおける実力の差は絶大

– トップ層は安定して常に上位をとり続ける

• トップの中のトップ選手 やってる人で知らない人は居ない.普段1位を取っても誰も驚かない.)

– 3位:Petr (ロシア, 現 3489, 最高 3923)

• 落ち着きがヤバイ.着実な感じ.

– 2位:ACRush (中国, 現 3511, 最高 3902)

• 勢いがヤバイ.怖い.結構ミスってオモロイ.

– 1位:tourist (ベラルーシ, 現 3583, 最高 3656)

• 最近では人類最強,何とまだ高校生…

59

トップ選手はどのように育つ?

Page 61: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 3

そこまでじゃなくても,世界大会に進出していくようなトップ層はどうやって生まれる?

60

トップ選手はどのように育つ?

Page 62: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 3

そこまでじゃなくても,世界大会に進出していくようなトップ層はどうやって生まれる?

修行あるのみ!! 問題を解きまくる!!

61

トップ選手はどのように育つ?

Page 63: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 3

62

トップ選手はどのように育つ?

tourist さん

10000 問解きました

Page 64: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 3

• 闇雲に解けば良いという物ではない

– 丁度いい難易度&質の良い問題

– ただ解くだけじゃなく,最大限に知見を得る

• 仲間の存在が重要かも?

– 解法や実装についての議論

– アイツに差をつけるんだ!って解きまくる

– 俺は岩田,北川(アリ本の人たち)とかなり一緒にやってた

63

トップ選手はどのように育つ?

Page 65: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 4

• 現在,日本は国別ランク 4 位

– 特に東京大学は大学ランク 1 位 (冒頭)

– 一方,僕がはじめた 5 年前はトップ 10 圏外

• 一体何が起きたのか?

64

日本はなぜ強豪国に?

Page 66: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 4

• コミュニティ形成・拡大

– コンテストをやる人自体が増えた

– テクニックや知識も簡単に手に入る

• 強者登場 → 憧れて練習,の良い循環

努力だけなら一人でもできる? → ×

トップ層は,かなりの時間をコンテストに捧げる割り切った生活になる.心強さが全然違う.

65

日本はなぜ強豪国に?

Page 67: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 5

基本的にはコンテストで問われるか否か

• 得意

– アルゴリズム

– プロトタイピング

– ややこしいルーチンの正確な実装

• 苦手

– 大規模なソフトウェアの設計・実装・メンテ • コンテスト以外でこういうそういうことをやっている人も居るとは思います

66

コンテスト勢の得意と不得意は?

Page 68: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 6

67

勉強か?趣味か?人生か?

Page 69: 勉強か?趣味か?人生か?―プログラミングコンテストとは

プログラミングコンテストの真相 6

もちろん全部! (ありきたりな答えですみません……)

• 勉強!

– 色々な能力が間違いなくついた

• 趣味!

– ちょー楽しい

• 人生!

– 一時期は熱中していて,本当にコンテスト=人生

– そうじゃない今でも,人生への影響は絶大 • コンテスト好きをこじらせてアルゴリズム研究

• かけがえのない人間関係や機会,経験

68

勉強か?趣味か?人生か?