
競技プログラミング、またはスポーツプログラミングは、参加者が与えられた仕様に従ってプログラミングを試みるマインドスポーツです。競技は通常、インターネットまたはローカルネットワーク上で開催されます。競技プログラミングは、 Google [ 1 ] [ 2 ]やMeta [ 3 ]などの複数の多国籍ソフトウェアおよびインターネット企業によって認知され、サポートされています。
プログラミングコンテストでは、一般的に主催者が論理問題や数学問題(パズルやチャレンジとも呼ばれる)を参加者(数十人から数百人、場合によっては数千人)に提示します。参加者はこれらの問題を解決できるコンピュータプログラムを作成する必要があります。審査は主に解決した問題数と解答作成に要した時間に基づいて行われますが、出力の質、実行時間、メモリ使用量、プログラムサイズなどの他の要素も考慮される場合があります。
最も古いコンテストの1つは、1970年代に始まった国際大学対抗プログラミングコンテスト(ICPC) [ 4 ]で、2011年版では88か国が参加するまでに成長しました。
1990年から1994年にかけて、オーウェン・アストラチャン、ヴィヴェク・ケラ、デビッド・コッツは、ICPCに触発された最初の分散型インターネットベースのプログラミングコンテストの1つを運営した。[ 5 ]
競技プログラミングへの関心は2000年以降、数万人の参加者にまで大幅に高まり(注目すべき競技会を参照)、インターネットの普及と密接に関係している。インターネットによって国際的な競技会をオンラインで開催しやすくなり、地理的な問題が解消されたためである。
競技プログラミングの目的は、与えられた問題を解決できるコンピュータ プログラムを作成することです。プログラミング コンテストに出題される問題の大部分は、数学的または論理的な性質のものです。典型的なそのようなタスクは、組み合わせ論、数論、グラフ理論、アルゴリズム ゲーム理論、計算幾何学、文字列解析、離散数学、データ構造のいずれかのカテゴリに属します。[ 6 ]制約プログラミングや人工知能に関連する問題も、一部のコンテストで人気があります。
問題のカテゴリーに関わらず、問題解決のプロセスは大きく2つのステップに分けられます。効率的なアルゴリズムの構築と、適切なプログラミング言語でのアルゴリズムの実装です(使用可能なプログラミング言語はコンテストによって異なります)。これらは、プログラミングコンテストで最も一般的に問われる2つのスキルです。
ほとんどのコンテストでは、審査はホストマシン(一般に審査員と呼ばれる)によって自動的に行われます。参加者が提出したすべての解答は、審査員上で一連の(通常は非公開の)テストケースに対して実行されます。通常、コンテストの問題は全か無かの採点システムを採用しており、解答は審査員が実行したすべてのテストケースで満足のいく結果を出した場合にのみ「受理」され、それ以外の場合は却下されます。ただし、一部のコンテスト問題では、合格したテストケースの数、結果の質、またはその他の指定された基準に応じて部分的な採点が認められる場合があります。また、参加者が指定された入力データに対応する出力を提出するだけでよいコンテストもあり、その場合は審査員は提出された出力データのみを分析すればよいことになります。
オンラインジャッジとは、テストが行われるオンライン環境のことです。オンラインジャッジには、特定の問題に対して最も多くの正解を出したユーザーや、実行時間が最短のユーザーを示すランキングリストがあります。[ 7 ]
上記のほとんどのコンテストは、通常、複数ラウンドで行われます。オンラインラウンドから始まり、最終ラウンドは会場で行われます。IOIとICPCでは、上位入賞者に金、銀、銅メダルが授与されます。その他のコンテストでは、上位入賞者に賞金が贈られます。また、これらのコンテストは、多くのソフトウェア企業やインターネット企業のリクルーターの注目を集め、採用担当者が参加者に求人オファーを出すこともよくあります。
世界中のプログラミングコミュニティは、競技プログラミングに特化したインターネットリソースを数多く作成・維持しています。これらのリソースでは、少額の賞品の有無にかかわらず、独立したコンテストが開催されています。ユーザーは通常、コンテストでの成績に基づいてレーティングが付けられます。過去の問題のアーカイブは、競技プログラミングのトレーニングに人気の高いリソースです。定期的にプログラミングコンテストを開催している団体もいくつかあります。例えば、以下のような団体です。
プログラミングコンテストへの参加は、学生のコンピュータサイエンス研究への熱意を高める可能性がある。ICPCのようなプログラミングコンテストで習得したスキルは、候補者にその場で複雑なプログラミングやアルゴリズムの問題を解くことを要求されることが多い「技術面接」を通過するのに役立つため、キャリアの見通しも向上させる。[ 19 ] [ 20 ]
競技プログラミングには、特にプロのソフトウェア開発者からの批判もある。[ 21 ]重要な点の1つは、多くのペースの速いプログラミングコンテストが、競技者に悪いプログラミング習慣やコードスタイル(マクロの不必要な使用、 OOPの抽象化とコメントの欠如、短い変数名の使用など)を教えてしまうことである。[ 22 ] [ 21 ]また、ICPCやIOIのようなプログラミングコンテストは、比較的短いソリューションを持つ小さなアルゴリズムパズルしか提供しないため、実際のソフトウェアプロジェクトは通常、何千行ものコードがあり、大規模なチームによって長期間にわたって開発されるため、必ずしも優れたソフトウェアエンジニアリングのスキルと実践を教えることにはならない。 [ 21 ] Peter Norvigは、入手可能なデータに基づくと、プログラミングコンテストの勝者であることと、Googleでの仕事におけるプログラマーのパフォーマンスとの間に負の相関関係があると述べた(コンテストの勝者は採用される可能性が高かったにもかかわらず)。[ 23 ] Norvigは後に、この相関関係は小さなデータセットで観察されたものだが、より大きなデータセットを調べた後には確認できなかったと述べた。[ 24 ]
別の意見としては、著名なプログラマーは、既知の解決策で問題を解決することで過度に競争することに時間を費やすのではなく、現実世界の問題を解決することに時間を費やすべきだというものがある。[ 21 ]