ACM国際大学対抗プログラミングコンテスト
ACM国際大学対抗プログラミングコンテスト (ACM International Collegiate Programming Contest、略称:ACM-ICPCまたは単にICPC) は、コンピュータープログラミングにおける勝ち抜き型のコンテストである。世界中の大学を対象として毎年開催されている。このコンテストはIBMにスポンサーとして協力を受けている。Executive DirectorのWilliam B. Poucher (大会本部であるベイラー大学に教授として在籍) のもと、ACMの後援によって六大州の各地で自律的に運営が行われている。
ACM国際大学対抗プログラミングコンテスト (ICPC) は1970年にテキサスA&M大学で開催されたコンテストがその始まりである。この年のコンテストはUpsilon Pi Epsilon Computer Science Honor Society (UPE) のAlpha Chapterが主催した。1977年にACM Computer Science Conferenceと併設して最初の決勝大会が行われ、この時から現在のような勝ち抜き型のコンテストとなった。
1977年から1989年の間は、主にアメリカ合衆国とカナダのチームを対象にして開催されていた。1989年からベイラー大学が大会本部となり、世界中の大学コミュニティの手で地区大会 (Regionals) が実施されるようになった。ACMの後援のもとで多くの企業のサポートを得て、2005年には84カ国からの参加がある世界的なコンテストに成長した。
1997年にIBMがスポンサーとなってから、コンテストの参加者は飛躍的に増大した。1997年の大会には560大学から840チームが、2007年には1,821大学から6,700チームが参加した。参加チーム数は毎年10-20%の割合で増え続けており、今後もさらに大規模になるだろうと考えられている。
ACM国際大学対抗プログラミングコンテストにおいて、世界大会 (ACM-ICPC World Finals) がその決勝戦である。歴史を振り返ると、世界各地の最高の開催地で4日間にわたるイベントが開催されている。このイベントで、Upsilon Pi Epsilonが全地区大会の優勝チームを表彰する。近年 (2009年時点) では、世界大会の優勝チームは自分たちの国の首脳から表彰を受け、毎年行われるACM Awards Ceremonyでも表彰されている。
日本では、国内で初めてとなるアジア地区予選大会が1998年に早稲田大学をホストとして東京で開催された。これ以降、会場を変えながら、日本国内でも毎年アジア地区予選が開催されている。
日本では国内での初開催以来、アジア地区予選大会に参加するチーム数を制限するため、アジア地区予選大会の前にインターネットを通して国内予選が行われている。例年、この国内予選で優秀な成績をおさめたチーム (近年は、上位に入った2大学の最上位チームであることが多い) は、日本以外で開催されるアジア地区予選大会へ金銭的な支援を受けて派遣される権利を得る。
2000年に筑波大学をホストとして開催されたアジア地区予選つくば大会では、国内予選への参加が88チーム、アジア地区予選への参加が34チームであった。2010年には、国内予選への参加が67大学287チーム、アジア地区予選大会への参加が30大学35チーム (国内予選に参加していない6チームの海外チームを含む) となっている。
ICPCはチーム戦であり、それぞれのチームは3人の学生から構成される。参加者は、国内予選前の時点で大学入学から5年(4月入学で1-3月生まれの場合は6年)に満たない大学生でなければならない。過去に世界大会に2年出場、もしくは地区予選大会に5年出場した学生は再び参加する権利を失う。
コンテストの間、チームは5時間で8-12問 (典型的には10問) のプログラミングの問題を解く。与えられた問題を解く順番は不問である。選手は回答のプログラムをC、C++、Javaのいずれかで書いて提出しなければならない。提出すると、プログラムはテストデータを入力として実行される。このテストデータは、コンテスト中は公開されない。プログラムが不正に終了した場合や、正しい解を出すことができなかった場合は選手にその旨が伝えられ、選手は何度でも回答プログラムを修正し、提出することができる。各問題ごとに規定された実行時間内にプログラムが実行を完了しなかった場合は、不正解の扱いとなる。
最も多くの問題を正解したチームが勝者となる。メダルや賞を与えるために引き分けのチームに順位をつける必要がある場合、コンテスト開始時から各問題に正解を提出した時点までの経過時間に最終的に正解した問題について不正解の提出ごとに20分が加算され、その総和によってチームの順位が決定される。
例えば2つのチームRedとBlueがそれぞれ2問を正解して引き分けとなっている状況を考える。チームRedは、コンテストの開始から1:00後と2:45後に、それぞれ問題AとBに解答を提出した。このチームは問題Cに対して不正解の通知を受けたが、最終的に問題Cを正解していないため、これは無視された。チームBlueは、コンテスト開始からそれぞれ1:20後と2:00後に、それぞれ問題AとCに解答を提出した。このチームは問題Cに対して1回不正解の通知を受けた。このとき、チームRedの総時間は1:00+2:45=3:45と、チームBlueの総時間は1:20+2:00+0:20=3:40となる。最終的にチームBlueの勝利となる。
他のプログラミングコンテスト (例えば国際情報オリンピック) と比較して、ICPCの特徴は問題数が多いこと (ちょうど5時間で8問以上) である。他の特徴として、チームには3人の学生がいるにも関わらず、各チーム1台しかコンピュータを使うことができないということがある。このことが時間のプレッシャーをより大きなものにしている。勝つためには良いチームワークとプレッシャーに耐える能力が必要である。
日本におけるアジア地区予選大会のルールは、基本的にはコンテスト全体で定められている上記のルールと同様である。1998年-2003年のアジア地区予選大会では問題数が8問だったが、2004年-2006年は9問、2007-2011年は10問で行われている。国内予選は3時間の制限時間で行われ、2003年までは5問、2004年-2009年は6問、2010-2011年は7問用意されている。
このコンテストはいくつかの段階で構成される。多くの大学では地区予選レベルの大会に参加するチームを決定するためのローカルコンテストを開催する。それから大学（の代表チーム）が地区予選大会に参加し、競技を行う。地区予選大会の勝者が世界大会に進出する。ある1つの大学から複数のチームが地区予選大会に参加することはできるが、世界大会には1つの大学から1つのチームしか参加することができない。各地区予選大会から、最低でも1チームが世界大会に進出する。多くのチームが参加する地区予選大会からは、複数のチームが世界大会に進出することがある。 (1つの巨大な地区予選大会から6チームものチームが出場することも時々ある)
1人の選手は世界大会に2回までしか参加することができない。
巨大な地区予選大会では、大学ごとのローカルコンテストと地区予選大会の間に小地区予選大会 (もしくは予選大会) を開くことがある。
2006年時点では、アジア地区からの世界大会進出チーム決定のルールが毎年のように変更されており、大きく揺れ動いている。
日本で開催される地区予選大会から世界大会へ進出するチームの決定は、基本的にアジア地区全体のルールに則って行われる。2018年時点で、世界大会に進出した日本の大学とその回数は、東京大学16回、京都大学14回、東京工業大学6回、会津大学3回、筑波大学3回、埼玉大学2回、電気通信大学2回、早稲田大学1回、大阪大学1回、慶應大学1回である。このうち、日本チームの過去最高成績は2013年と2015年の東京大学チームの3位である。世界大会が日本で開催されるのは2007年が初となる。