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




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




                      東京大学 修士 2 年

                  秋葉 拓哉
自己紹介


 • 秋葉拓哉 (@iwiwi)
   – 東京大学 修士 2 年 (博士進学予定)
   – DB 系グラフアルゴリズムの研究

 • プログラミングコンテストガチ勢
   – TopCoder レーティング 3035 (いわゆるレッドコーダー)
   – 世界的コンテストの決勝進出 10 回
   – トップ 10 入り 4 回




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


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




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




                              2
今日の目標


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


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


  <学生>     <先生>    <社会人>
  ちょっと     参加を     採用で評価
 やろうかな?   促そうかな?   してみるか?

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


         プログラミングコンテストとは
    「プログラミングでやるスポーツ」

 • 開始と共に問題が出題される
 • 問題を解くプログラムを作成する
 • 時間内に,出来るだけ多く




    問題           解く       順位
                               4
プログラミングコンテスト紹介

           解答                         問題
  #include <iostream>
                                 標準入力に,2 つの正整数が
  int main() {
    int a, b;                    与えられます.
    cin >> a >> b;               その和を標準出力に出力して
    cout << a + b << endl;       ください.
    return 0;
  }




      ジャッジサーバ


                             自動でコンパイル・テスト
                             即座に正誤判定・順位表更新

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




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




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




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




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




      楽しい!!
         頭がオカシイのでは?
         言われたプログラム作るだけじゃん
     世界中の人を惹きつけるに
 ( ゚д゚)  楽しいの?課題と何が違うわけ?

      足る理由があります


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


 • ゲーム的な楽しさ
  – 時間制限の中で急いでプログラムを書く
  – 即採点,即順位更新,リアルタイム
  – インターネット越しに世界中の数千人と対戦

 • 情報科学的な楽しさ
   – アルゴリズムを考えるのが楽しい
   – プログラミングが楽しい




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


 • ゲーム的な楽しさ
  – 時間制限の中で急いでプログラムを書く
  – 即採点,即順位更新,リアルタイム
  – インターネット越しに世界中の数千人と対戦

 • 情報科学的な楽しさ
   – アルゴリズムを考えるのが楽しい
   – プログラミングが楽しい




                           10
問題の例




• 𝑛 匹のアリが 1 cm/s で歩く
• 初期位置が入力される,向きを我々が決める

• ぶつかったら反対を向いて歩き出す
• 端まで行くと落っこちる

• アリが全滅するまでの時間を最大化したい
• 𝒏 ≤ 𝟏𝟎
                         11
問題の例




  t=0




   0    1   2   3   4   5   6   7   8   9   10




                                                 12
問題の例




  t=1




   0    1   2   3   4   5   6   7   8   9   10




                                                 13
問題の例




  t=2




   0    1   2   3   4   5   6   7   8   9   10




                                                 14
問題の例




  t=2




   0    1   2   3   4   5   6   7   8   9   10




                                                 15
問題の例




  t=3




   0    1   2   3   4   5   6   7   8   9   10




                                                 16
問題の例




  t=3




   0    1   2   3   4   5   6   7   8   9   10




                                                 17
問題の例




  t=4




   0    1   2   3   4   5   6   7   8   9   10




                                                 18
問題の例




  t=5




   0    1   2   3   4   5   6   7   8   9   10




                                                 19
問題の例




  t=6




   0    1   2   3   4   5   6   7   8   9   10




                                                 20
問題の例




  t=7




   0    1   2   3   4   5   6   7   8   9   10




                                                 21
問題の例




  t=8




   0    1   2   3   4   5   6   7   8   9   10




                                                 22
問題の例


 全探索のアルゴリズム
  全ての向きの候補に対してシミュレーションを
  行い,最大の時間を求める


 向きの候補は全部で 2 𝑛 通り
 10匹なら…… 210 = 1024 通り




                          23
問題の例




• 𝑛 匹のアリが 1 cm/s で歩く
• 初期位置が入力される,向きを我々が決める

• ぶつかったら反対を向いて歩き出す
• 端まで行くと落っこちる

• アリが全滅するまでの時間を最大化したい
• 𝒏 ≤ 𝟏𝟎
                         24
問題の例 2




• 𝑛 匹のアリが 1 cm/s で歩く
• 初期位置が入力される,向きを我々が決める

• ぶつかったら反対を向いて歩き出す
• 端まで行くと落っこちる

• アリが全滅するまでの時間を最大化したい
• 𝒏 ≤ 𝟏000
                         25
問題の例 2


 全探索のアルゴリズム
   全ての向きの候補に対してシミュレーションを
   行い,最大の時間を求める


 向きの候補は全部で 2 𝑛 通り
 1000匹なら…… 21000 ≒ 10300 通り
             天文学的数字 !
         (宇宙の年齢 ≒ 4.3 × 1017 秒)


                                  26
27
28
29
30
31
32
33
問題の例 2


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




                         34
問題の例2


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

 効率の良いアルゴリズム
   各アリから遠い方の端までの距離の最大値


 𝑂(𝑛) 時間しかかからない
 1000匹居ても超余裕!



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


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

               問題


          アルゴリズム設計



           プログラム実装

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


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

 大きく分けると 2 つ
 1. 幅広い知識
  – 基礎的なアルゴリズムの知識
    • データ構造,グラフ,連立方程式,…
  – 設計技法,その実例
    • 動的計画法,貪欲法,ネットワークフロー,……

 2. 柔軟な思考力・経験
  – 実際にアルゴリズムを設計する
                               37
プログラミングコンテストで問われるもの


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

 • 大学の授業?有名な教科書?
  – 知識についてのみカバーされる

 • 本「アルゴリズムデザイン」
  – 設計技法について詳しく扱う珍しい本

 • アルゴリズムの適用法,組合せ方
 • 細かいテクニック
 • 少し進んだアルゴリズム
 こういった物を知るには昔は苦労がつきなかったが……!
                              38
プログラミングコンテストで問われるもの


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

 • 実装に関する能力
  –   スラスラと書く
      •   言語への慣れ,見通し
  –   コンパクトに書く
      •   標準ライブラリの活用,抽象化
  –   正確に実装する
      •   間違いやすい部分に気づく,無理に短くしない


 • デバッグに関する能力
  –   すぐに間違っている部分を特定する
  –   デバッグしやすいテストケースを考える
                                   39
プログラミングコンテストで問われるもの


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

 • 実装が楽なアルゴリズムを選択する
   – アルゴリズムを思いついても,満足しない
   – もっと簡単に実装できる別解を探る

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




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


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

      問題


 アルゴリズム設計



  プログラム実装

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


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

      問題

               やらない人には意外な事実?
 アルゴリズム設計
               この部分の方が差がつく

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


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




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


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




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




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


 ACM/ICPC
 • 大学対抗プログラミングコンテスト
 • 1970 年開始,最も歴史がある
 • 世界約 2000 大学から 20000 人以上が参加!

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




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




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




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


 Google Code Jam

 • Google の開催するコンテスト
 • 世界中から 10000 人以上が参加


 TopCoder
 • インターネットで定期的に開催される
 • 参加者にはレーティングが付き評価される
 • 毎年 1 度,アメリカで世界大会


                         48
TopCoder Open 2011




                     49
TopCoder Open 2011




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


    どのコンテストが一番凄いの?
 • 現在 ACM-ICPC の知名度・評価がダントツ
   – 歴史がある?
   – 規模が大きい?

 • これに僕は異議を唱えたい!
 • 他の世界的コンテストも知って,それらでの戦
   果も正当に評価してほしい!


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


      どのコンテストが一番凄いの?
 ACM-ICPC の最大の問題点:歪んだルール
 •   大学,地域ごとの格差がメチャクチャ
 •   例えば,大学ごとに進出校数制限
 •   東大からの世界大会進出は超絶大変
 •   他校の世界大会進出チームは,東大の敗退チー
     ムより下位なことがよくある
     – 従って,「世界大会進出」の背景が全然違う

 また,年齢制限・回数制限なども厳しいため,例
 えば優勝者が本当に時点最強と言えない
                              52
プログラミングコンテストの真相 1


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

 • TopCoder Open
   – ほぼ全人類が参加可! (スタッフ以外)
 • Google Code Jam,Facebook Hacker Cup
   – 社員以外参加可!
 ただし 18 歳以上



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


     どのコンテストが一番凄いの?
 ACM-ICPC の他の問題点
 • 問題が面白くない
   – アルゴリズム的な面白さが重視されていない
   – 実装するだけの問題ばかり

 • 問題の準備が適当
   – 世界大会でも入力データにミス (最近だと 2007 年問題 J)
   – しかも無視し結果はそのまま,公式サイトには情報なし
   – 当時の掲示板カキコで見れる http://bit.ly/RZGqfE



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


    どのコンテストが一番凄いの?
 ACM-ICPC は裾野が広いのが素晴らしい

 • 大学対抗,年に 1 回
 • ACM が後援で先生方も応援してくれる
 • 予選は問題も日本語
 • 予選を突破すると日本の地区予選に行ける
   – トップ 100 人ぐらい
   – 他の大会では旅行が伴うのはかなり上のみ

 参加の価値は依然として高い
                           55
プログラミングコンテストの真相 2


  「レッドコーダー」は本当に凄い?
 レッドコーダーとは?
 • TopCoder では,レーティング (評価値) に応じて,
   名前に色がつく
 • レーティングが 2200 に到達し赤色になった人のこと




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


  「レッドコーダー」は本当に凄い?
 • 世界に約 300 人,上位 3 %に相当
 • 日本には現在 26 人
   –   ちなみに,俺がはじめた頃は 4 人とか
   –   本当に神だと思って憧れてた,崇めてた
   –   信じられないような速度・正確性
   –   安定した上位
   –   自分がそうなれる日が来ると思ってなかった



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


  「レッドコーダー」は本当に凄い?
 ……でも実はもっと遥かに凄い集団が!!!
               その名も「ターゲット」
 • レーティングが 3000 に到達した人のこと
 • 名前の左側のインジケータが満タンになる
   – 射的の的(=ターゲット)になる
                                     ↓ レッドコーダー (溜りかけ)
 • 世界に 18 人,上位 0.2%!
   – レッドコーダー (= 上位 3%) のさらに上位 6%
                                       ↓ ターゲット(満タン)
 • 日本には 3 人!
   – lyrically, wata, 俺 (+ rng_58)

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


     トップ選手はどのように育つ?
 • コンテストにおける実力の差は絶大
   – トップ層は安定して常に上位をとり続ける

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

   – 3位:Petr (ロシア, 現 3489, 最高 3923)
     • 落ち着きがヤバイ.着実な感じ.
   – 2位:ACRush (中国, 現 3511, 最高 3902)
     • 勢いがヤバイ.怖い.結構ミスってオモロイ.
   – 1位:tourist (ベラルーシ, 現 3583, 最高 3656)
     • 最近では人類最強,何とまだ高校生…

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


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




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


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



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

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


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




                10000 問解きました

   tourist さん




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


    トップ選手はどのように育つ?
 • 闇雲に解けば良いという物ではない
   – 丁度いい難易度&質の良い問題
   – ただ解くだけじゃなく,最大限に知見を得る


 • 仲間の存在が重要かも?
   – 解法や実装についての議論
   – アイツに差をつけるんだ!って解きまくる
   – 俺は岩田,北川(アリ本の人たち)とかなり一
     緒にやってた
                             63
プログラミングコンテストの真相 4


        日本はなぜ強豪国に?
 • 現在,日本は国別ランク 4 位
   – 特に東京大学は大学ランク 1 位 (冒頭)
   – 一方,僕がはじめた 5 年前はトップ 10 圏外


 • 一体何が起きたのか?




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


        日本はなぜ強豪国に?
 • コミュニティ形成・拡大
   – コンテストをやる人自体が増えた
   – テクニックや知識も簡単に手に入る

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

 努力だけなら一人でもできる?     →   ×
 トップ層は,かなりの時間をコンテストに捧げる
  割り切った生活になる.心強さが全然違う.


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


   コンテスト勢の得意と不得意は?
 基本的にはコンテストで問われるか否か
 • 得意
   – アルゴリズム
   – プロトタイピング
   – ややこしいルーチンの正確な実装
 • 苦手
   – 大規模なソフトウェアの設計・実装・メンテ
     • コンテスト以外でこういうそういうことをやっている人も居
       るとは思います
                                 66
プログラミングコンテストの真相 6


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




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


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

          もちろん全部!
           (ありきたりな答えですみません……)
 • 勉強!
   – 色々な能力が間違いなくついた
 • 趣味!
   – ちょー楽しい
 • 人生!
   – 一時期は熱中していて,本当にコンテスト=人生
   – そうじゃない今でも,人生への影響は絶大
     • コンテスト好きをこじらせてアルゴリズム研究
     • かけがえのない人間関係や機会,経験


                                68

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

  • 1.
    2012/09/16 情報科学若手の会 勉強か?趣味か?人生か? プログラミングコンテストとは 東京大学 修士 2 年 秋葉 拓哉
  • 2.
    自己紹介 • 秋葉拓哉(@iwiwi) – 東京大学 修士 2 年 (博士進学予定) – DB 系グラフアルゴリズムの研究 • プログラミングコンテストガチ勢 – TopCoder レーティング 3035 (いわゆるレッドコーダー) – 世界的コンテストの決勝進出 10 回 – トップ 10 入り 4 回 銅メダル (2012) 世界 7 位 (2011) 世界 9 位 (2010) 日本人のメダルは 9 年ぶり 世界 9 位 (2009) 1
  • 3.
    自己紹介 プログラミングコンテストチャレンジブック 累計一万部突破 韓国・台湾の翻訳版 (中国版も翻訳中) 2
  • 4.
    今日の目標 プログラミングコンテストは アツい!おもろい! 関心と理解を持ってもらう! <学生> <先生> <社会人> ちょっと 参加を 採用で評価 やろうかな? 促そうかな? してみるか? 3
  • 5.
    プログラミングコンテスト紹介 プログラミングコンテストとは 「プログラミングでやるスポーツ」 • 開始と共に問題が出題される • 問題を解くプログラムを作成する • 時間内に,出来るだけ多く 問題 解く 順位 4
  • 6.
    プログラミングコンテスト紹介 解答 問題 #include <iostream> 標準入力に,2 つの正整数が int main() { int a, b; 与えられます. cin >> a >> b; その和を標準出力に出力して cout << a + b << endl; ください. return 0; } ジャッジサーバ 自動でコンパイル・テスト 即座に正誤判定・順位表更新 5
  • 7.
    プログラミングコンテストの楽しさ 頭がオカシイのでは? 言われたプログラム作るだけじゃん ( ゚д゚) 楽しいの?課題と何が違うわけ? 6
  • 8.
    プログラミングコンテストの楽しさ 頭がオカシイのでは? 言われたプログラム作るだけじゃん ( ゚д゚) 楽しいの?課題と何が違うわけ? 7
  • 9.
    プログラミングコンテストの楽しさ 楽しい!! 頭がオカシイのでは? 言われたプログラム作るだけじゃん 世界中の人を惹きつけるに ( ゚д゚) 楽しいの?課題と何が違うわけ? 足る理由があります 8
  • 10.
    プログラミングコンテストの楽しさ • ゲーム的な楽しさ – 時間制限の中で急いでプログラムを書く – 即採点,即順位更新,リアルタイム – インターネット越しに世界中の数千人と対戦 • 情報科学的な楽しさ – アルゴリズムを考えるのが楽しい – プログラミングが楽しい 9
  • 11.
    プログラミングコンテストの楽しさ • ゲーム的な楽しさ – 時間制限の中で急いでプログラムを書く – 即採点,即順位更新,リアルタイム – インターネット越しに世界中の数千人と対戦 • 情報科学的な楽しさ – アルゴリズムを考えるのが楽しい – プログラミングが楽しい 10
  • 12.
    問題の例 • 𝑛 匹のアリが1 cm/s で歩く • 初期位置が入力される,向きを我々が決める • ぶつかったら反対を向いて歩き出す • 端まで行くと落っこちる • アリが全滅するまでの時間を最大化したい • 𝒏 ≤ 𝟏𝟎 11
  • 13.
    問題の例 t=0 0 1 2 3 4 5 6 7 8 9 10 12
  • 14.
    問題の例 t=1 0 1 2 3 4 5 6 7 8 9 10 13
  • 15.
    問題の例 t=2 0 1 2 3 4 5 6 7 8 9 10 14
  • 16.
    問題の例 t=2 0 1 2 3 4 5 6 7 8 9 10 15
  • 17.
    問題の例 t=3 0 1 2 3 4 5 6 7 8 9 10 16
  • 18.
    問題の例 t=3 0 1 2 3 4 5 6 7 8 9 10 17
  • 19.
    問題の例 t=4 0 1 2 3 4 5 6 7 8 9 10 18
  • 20.
    問題の例 t=5 0 1 2 3 4 5 6 7 8 9 10 19
  • 21.
    問題の例 t=6 0 1 2 3 4 5 6 7 8 9 10 20
  • 22.
    問題の例 t=7 0 1 2 3 4 5 6 7 8 9 10 21
  • 23.
    問題の例 t=8 0 1 2 3 4 5 6 7 8 9 10 22
  • 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
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
    問題の例 2 よく考えると,アリを区別する必要がない 34
  • 36.
    問題の例2 衝突を考える必要が実は全くない! 効率の良いアルゴリズム 各アリから遠い方の端までの距離の最大値 𝑂(𝑛) 時間しかかからない 1000匹居ても超余裕! 35
  • 37.
  • 38.
    プログラミングコンテストで問われるもの アルゴリズム設計 のために必要なもの 大きく分けると 2 つ 1. 幅広い知識 – 基礎的なアルゴリズムの知識 • データ構造,グラフ,連立方程式,… – 設計技法,その実例 • 動的計画法,貪欲法,ネットワークフロー,…… 2. 柔軟な思考力・経験 – 実際にアルゴリズムを設計する 37
  • 39.
    プログラミングコンテストで問われるもの アルゴリズム設計 の知識を得る方法 • 大学の授業?有名な教科書? – 知識についてのみカバーされる • 本「アルゴリズムデザイン」 – 設計技法について詳しく扱う珍しい本 • アルゴリズムの適用法,組合せ方 • 細かいテクニック • 少し進んだアルゴリズム こういった物を知るには昔は苦労がつきなかったが……! 38
  • 40.
    プログラミングコンテストで問われるもの プログラム実装 のために必要なもの • 実装に関する能力 – スラスラと書く • 言語への慣れ,見通し – コンパクトに書く • 標準ライブラリの活用,抽象化 – 正確に実装する • 間違いやすい部分に気づく,無理に短くしない • デバッグに関する能力 – すぐに間違っている部分を特定する – デバッグしやすいテストケースを考える 39
  • 41.
    プログラミングコンテストで問われるもの プログラム実装 のために必要なもの • 実装が楽なアルゴリズムを選択する – アルゴリズムを思いついても,満足しない – もっと簡単に実装できる別解を探る – 制約が緩ければ,逆に計算量や精度が悪くし てでもシンプルにして実装を楽に 40
  • 42.
  • 43.
    プログラミングコンテストで問われるもの アルゴリズム設計とプログラミングの複合競技 問題 やらない人には意外な事実? アルゴリズム設計 この部分の方が差がつく アルゴリズムの方が難易度の幅が大きい プログラム実装 強い人には一瞬でも, 苦手な人はいつまで経っても解けなかったり 42
  • 44.
  • 45.
    プログラミングコンテストの真相 1 どのコンテストが一番凄いの? まずは色々なコンテストを紹介! 44
  • 46.
    プログラミングコンテスト ACM/ICPC •大学対抗プログラミングコンテスト • 1970 年開始,最も歴史がある • 世界約 2000 大学から 20000 人以上が参加! • 3 人 1 チームのチーム戦 45
  • 47.
  • 48.
  • 49.
    プログラミングコンテスト Google CodeJam • Google の開催するコンテスト • 世界中から 10000 人以上が参加 TopCoder • インターネットで定期的に開催される • 参加者にはレーティングが付き評価される • 毎年 1 度,アメリカで世界大会 48
  • 50.
  • 51.
  • 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
  • 61.
    プログラミングコンテストの真相 3 トップ選手はどのように育つ? そこまでじゃなくても,世界大会に進出していく ようなトップ層はどうやって生まれる? 60
  • 62.
    プログラミングコンテストの真相 3 トップ選手はどのように育つ? そこまでじゃなくても,世界大会に進出していく ようなトップ層はどうやって生まれる? 修行あるのみ!! 問題を解きまくる!! 61
  • 63.
    プログラミングコンテストの真相 3 トップ選手はどのように育つ? 10000 問解きました tourist さん 62
  • 64.
    プログラミングコンテストの真相 3 トップ選手はどのように育つ? • 闇雲に解けば良いという物ではない – 丁度いい難易度&質の良い問題 – ただ解くだけじゃなく,最大限に知見を得る • 仲間の存在が重要かも? – 解法や実装についての議論 – アイツに差をつけるんだ!って解きまくる – 俺は岩田,北川(アリ本の人たち)とかなり一 緒にやってた 63
  • 65.
    プログラミングコンテストの真相 4 日本はなぜ強豪国に? • 現在,日本は国別ランク 4 位 – 特に東京大学は大学ランク 1 位 (冒頭) – 一方,僕がはじめた 5 年前はトップ 10 圏外 • 一体何が起きたのか? 64
  • 66.
    プログラミングコンテストの真相 4 日本はなぜ強豪国に? • コミュニティ形成・拡大 – コンテストをやる人自体が増えた – テクニックや知識も簡単に手に入る • 強者登場 → 憧れて練習,の良い循環 努力だけなら一人でもできる? → × トップ層は,かなりの時間をコンテストに捧げる 割り切った生活になる.心強さが全然違う. 65
  • 67.
    プログラミングコンテストの真相 5 コンテスト勢の得意と不得意は? 基本的にはコンテストで問われるか否か • 得意 – アルゴリズム – プロトタイピング – ややこしいルーチンの正確な実装 • 苦手 – 大規模なソフトウェアの設計・実装・メンテ • コンテスト以外でこういうそういうことをやっている人も居 るとは思います 66
  • 68.
    プログラミングコンテストの真相 6 勉強か?趣味か?人生か? 67
  • 69.
    プログラミングコンテストの真相 6 勉強か?趣味か?人生か? もちろん全部! (ありきたりな答えですみません……) • 勉強! – 色々な能力が間違いなくついた • 趣味! – ちょー楽しい • 人生! – 一時期は熱中していて,本当にコンテスト=人生 – そうじゃない今でも,人生への影響は絶大 • コンテスト好きをこじらせてアルゴリズム研究 • かけがえのない人間関係や機会,経験 68