競技プログラミング

競技プログラミング（きょうぎプログラミング、略称: 競プロ）とは、 プログラミングを用いた競技活動を指す言葉である。その定義は、歴史的な変遷や文脈によって、主に以下の3つの意味で用いられる。

 特定の団体とその活動： 日本における「東京大学競技プログラミング同好会」という特定のサークル、およびその活動。
 コンテスト形式の総称（）： ICPC（国際大学対抗プログラミングコンテスト）に代表される、時間内に問題を解くコードを記述し正解数を競う競技形式。
 関連する知的活動全般： 上記同好会の構成員が好んで取り組んだ、数学的・アルゴリズム的なプログラミング課題（Project Euler等）を含む広範な活動。

 概要 
1. 組織名としての発祥

もともと「競技プログラミング」という言葉は、「東京大学競技プログラミング同好会」という団体、およびその活動内容を指す固有名詞的な側面を強く持っていた。この団体は、主にICPC（国際大学対抗プログラミングコンテスト）に向けた練習会の実施や、それに準じたルールの大会を開催することを主目的としていた 。

2. コンテスト形式としての定義

上記団体の活動が一般化するにつれ、ICPCに代表される特定のコンテスト形式そのものを指す一般名詞として定着した。この形式における競技プログラミングは、一般的に「複数の問題が与えられ、問題ごとにコードを書き、制限時間内に入出力の一致した問題の数を競うもの」と定義される（例：情報オリンピック、Google Code Jam、Topcoder、Codeforces、AtCoder Grand Contest (AGC)）。

3. 広義の定義と文化

さらに広義には、「競技プログラミング同好会」の構成員が好んで取り組んでいた、周辺的なプログラミング・チャレンジ全般を包含する。

 オンラインジャッジ：オンラインでソースコード等を提出すると正誤が判定される仕組み（例：CodeChef、Project Euler、AizuOnlineJudge）。
 ショートコーディング：入出力の一致するできるだけ短いソースコードを書く（例：Imagine Cup 2008アルゴリズム部門）。
 数学的プログラミング（数論・パズル）：プログラミングを「数学的な難問を解くための道具」として使用する形式（例：Project Euler）。
 プログラミングパズル：プログラムにまつわるパズルを解け（例：codepuzzle, python challenge）。
 速度最適化コンテスト：入出力の一致する範囲でできるだけ速いプログラムを書く（例：SuperCon）。
 ヒューリスティック・マラソン形式：厳密な正解が存在しない、あるいは現実的な時間で正解を出すのが困難な「最適化問題」を扱う（例：AtCoder Heuristic Contest (AHC)、Topcoder Marathon Match、ICFP Programming Contest）。
 機械学習：最適化問題の中でも機械学習によりできるだけスコアの高いモデルを作成する（例：Kaggle）。
 AI・ボット競技: プレイヤー同士が作成したプログラム（AI）を対戦させる形式（例：Codingame、ICFP Programming Contest、全国高等専門学校プログラミングコンテスト競技部門）。
 CTF (キャプチャー・ザ・フラッグ、Capture The Flag): セキュリティ技術を競う。バイナリ解析などでプログラミング能力を要する。

多くのコンテストでが採用されている。また、競技プログラミングに参加する人を「競技プログラマ」または「競プロer」と呼ぶことがある。

競技プログラミングのコンテストは、プログラミング教育において注目されている競争型学習において演習方法に適しているとする意見もある。

 歴史 
古いものとしては1970年代にアメリカのテキサスA&M大学で開催されるようになった:en:International Collegiate Programming Contest (ICPC)を挙げることができる。これは2011年大会では88カ国で開催されるまでに成長した。

1990年から1994年にかけて、アメリカの:en:Owen Astrachan、Vivek Kheraらが上述のICPCの影響を受けつつインターネット上でプログラミング競技会を開催した。

 日本において 
日本では、1980年代から広義のプログラミングコンテストが存在した。主に高校生や高専生を対象とし、審査員が作品や成果を評価する形式が主流であった。以下に代表的な例を挙げる：
 1980年：全国高校生プログラミングコンテスト(後にU-22プログラミングコンテストに改名)
 1990年：全国高等専門学校プログラミングコンテスト
 2002年：日本学生科学賞ソリューション部門（後に情報技術部門に改名）

1994年には、全国高等専門学校プログラミングコンテストで競技部門が設けられた。しかし、これは「準備してきたプログラムで競う」もので、現在一般的に知られる競技プログラミングとは異なっていた。

日本での「なるべく速く正しいコードを書く」趣旨のプログラミングコンテストは、1994年から1997年まで開催された日本情報オリンピック(旧ウェブサイト)が始まりであった。このコンテストは中高生を対象としていた。次いで、1995年には東京工業大学主催のSuperCon（スパコン）が開始した。このコンテストは、「速いコードを書く」「難しい問題に最適解に近い解を出す」ことを目的としている。これらの大会の卒業生を中心に、1998年からは日本も国際大学対抗プログラミングコンテスト（ICPC）に参加し始め、大学生向けのプログラミングコンテストが活発化した。

2003年には、パソコン甲子園が開始され、高校生や高専生を対象とした「なるべく速く正しいコードを書く」部門が設けられた。さらに、2006年には日本情報オリンピックが再び開かれるようになった。2004年には、ICPCのOB/OGによる大学を超えた合同練習会が開催され、ICPC OB/OGの会としての活動が始まった。現在まで続くプログラミングコンテストのコミュニティが出現し、世代を超えた知識の継承や技術向上がされるようになる。また、2004年頃からTopCoderに参加する日本人も現れるようになる。

当時の参加者の証言によると、この時点でまだ「競技プログラミング」という概念はなく、「プロコン」と呼び、参加者を「プロコン勢」と呼んでいた。「競技プログラミング」という言葉は、2007年に、東京大学理学部情報科学科に当時所属していた松本宜丈が作成した「東京大学競技プログラミング同好会 2007年春台湾合宿」と銘打ったパンフレットが初出であるとされる。台湾合宿には大学同期12人が参加し、この合宿のメンバーを総称して、東京大学競技プログラミング同好会の名称が付けられた。松本自身は当時東京大学にいくつか存在した「競技○○部」という名前の体育会やサークルから着想を得たと述べている。後に東京大学競技プログラミングクラブと改名して継続的な勉強会となり、後輩の育成にも励んだため、競技プログラミングという言葉が広く使われるようになった。

OB/OGによる練習会に参加した大学生は、大学でも自主的な練習会を開いていた。その中でも影響の大きかったものが東京大学競技プログラミング同好会である。東京大学競技プログラミングクラブの練習会には、東京大学の学生だけではなく、埼玉大学、早稲田大学、京都大学などの大学生や筑波大学附属駒場高校の高校生も参加しており、多数のプロコン競技者・教育者を輩出した。また、学生主体で「なるべく速く正しいコードを書く」プログラミングコンテスト UTPCを開催し、社会人、大学生、高専生、高校生などさまざまな人々が参加した。そして、出場者らによって、会津大学プログラミングコンテスト UAPC 2009、京都大学プログラミングコンテスト KUPC 2011など様々な大学名を冠したコンテストが開かれるようになった。このため、2010年頃から「競技プログラミング」は練習会の名前としてだけではなく、「なるべく速く正しいコードを書く」コンテストなどを指す用語としても徐々に使われ始めた 。

その後、出身者によってさらに影響が広がっていった。たとえば、Google Code Jam JapanのスタッフはICPC OB/OG会のスタッフやUTPCのスタッフがほとんどである。

+競技プログラミング同好会の出身者の例北川宜稔、岩田陽一、秋葉拓哉 (HITORI++、(iwi))「プログラミングコンテストチャレンジブック」の著者。岩田はAtCoder AHC Adminでもある。 (rng_58)TopCoder admin、AtCoder コンテスト監査原健太朗 (haraken)Google Japan が提供しているSTEPという教育プログラムを立ち上げ400名以上を教育した。

高橋直大（AtCoder社代表）もUTPC 2009からのコンテスト参加者である。

なお、UTPC 2011は、AtCoder上で開かれた最初のコンテストであり、現在でも提出が可能である。

 主要なコンテスト 
主にインターネット上、各種ウェブサイトで、定期的に開催されている。

下記のリストは、コンテスト以外にも「」を含む（CodeChef、Project Euler、AizuOnlineJudgeなどが該当）。また、ICFPCは年によって出題のタイプが変わるが「難しい問題に最適解に近い解を出す」「AIを戦わせる」「パズルを解く」などである。Imagine Cupにも複数の部門があるが「なるべく速く正しいコードを書く」部門はない。

 日本国内 
 サイト名 概要 ウェブサイト AtCoder 高橋直大が代表取締役を務めるAtCoder社が提供するプログラミングコンテストサイト。  日本情報オリンピック(Japanese Olympiad in Infomatics(JOI)) 高校生向けプログラミングコンテストの国際情報オリンピック(IOI)の代表選考のためのコンテスト。  AizuOnlineJudge 会津大学が公開している。ICPCの過去問などを出題している。 

 海外 
 サイト名 概要 ウェブサイト Topcoder アメリカのAppirio社が提供するプログラミングコンテストサイト。   ロシアの大学 (Saratov State University) に所属するMike Mirzayanovらが実施するプログラミングコンテストサイト。   アメリカにあるプログラミングコンテストサイト。   Directi社が運営・提供するプログラミング学習サイト。  Project Euler 数学の問題が出題される。 

 国際大会 
 大会名 略称 概要 ウェブサイト  GCJ Googleが実施するプログラミングコンテスト。 https://code.google.com/codejam/  FHC Facebookが実施するプログラミングコンテスト。 https://www.facebook.com/hackercup/ ACM-ICPC 国際大学対抗プログラミングコンテスト ACM-ICPC 大学対抗のプログラミングコンテスト。1970年から始まり今に続く歴史あるコンテストである。 https://icpc.baylor.edu/ TopCoder Open TCO TopCoderが実施する祭典コンテスト。 （2016年度）https://tco16.topcoder.com/  ICFPC 関数型プログラミング言語のカンファレンスが実施するコンテスト。 https://www.icfpconference.org/contest.html Microsoft Imagine Cup マイクロソフトが実施する学生向けのプログラミングコンテスト。 https://www.imaginecup.com/ 国際情報オリンピック(International Olympiad in Informatics) IOI 高校生向けのプログラミングコンテスト。日本人が参加する場合、予選となる日本情報オリンピックに参加して代表に選ばれる必要がある。 

 人材採用での活用 
コンピュータサイエンスや数学の知識を必要とする問題が多く、新卒学生の採用活動などに使われることもある。TopCoderやなどの海外の多くの競技プログラミングサイトでは会員登録の際に求人情報の紹介を受けるかどうかを選択できる。日本においてはリクルート (CODE FESTIVAL、CODE VS、CodeIQ) やギノ (paiza) などで学生や転職希望者向けの求人の紹介が行われているほか、競技プログラミングサイトであるAtCoderではAtCoderでのユーザーのレートを利用した人材採用サービスとしてAtCoderJobsを展開している。

 国際大会における日本人参加者の成績 
 岩田陽一、が「2010 TopCoder Open」の異なる部門で優勝し、日本人が2部門を制した。
 慶應義塾大学(当時)の高橋直大がMicrosoftが主催するImagine Cup 2008アルゴリズム部門で世界第3位となった。
 東京大学(当時)の岩田陽一がGoogleが主催するプログラミングコンテスト「Google Code Jam 2009」で3位に入賞。

 出典 

 参考文献 


 関連項目 




 関連人物 
 高橋直大
 ゲンナジー・コロトケビッチ

 関連分野 
 プログラミングコンテスト

 キャプチャー・ザ・フラッグ#コンピュータセキュリティ
 Kaggle

Category:競技会
*