Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

63,006 views

Published on

  • Be the first to comment

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

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

×