この記事は新歓ブログリレー2019 8日目の記事です。たぶん。
18Bのeiyaです。競技プログラミング(競プロ)やCTFをしています。昔はゲーム制作もしていたんですが忙殺されてここ3年くらいまともに作っていません。悲しいです。
競技プログラミングは出来る側の人間のはずなんですが僕よりも強い人類が東工大には沢山います。楽しいです。
対象読者
この記事は以下の人を対象にしています。
- プログラミングに興味があるけどしたことが無い人
- プログラミングが楽しいけど競技プログラミングをしたことが無い人
競技プログラミングとは
ある課題を解くプログラムを作成するというゲームです。
例え次のような問題があります。
https://atcoder.jp/contests/abs/tasks/abc086_a
https://atcoder.jp/contests/abs/tasks/abc087_b
AtCoderというサイトでは、プログラムを作成する速さを競うコンテストが毎週末に行われています。
競技プログラミングで身につくこと/つかないこと
競技プログラミングを学ぶと以下の能力を身につけることができます。(主観)
- そこそこの速さのタイピング(触る時間が増えれば自然と上がってきます)
- 文章を見て問題を正確に把握する能力
- 大きな問題を小さな論理ステップの組み合わせと解釈する能力
- プログラミングの根幹である基本的な論理構造を理解し、記述する能力
- 見落としなく全ての可能性を考慮出来る注意力
- コンピュータがある計算にかける時間を見積もる能力
- 効率的な計算方法を選ぶ能力
- 大規模なデータを高速に処理する為の知識(シングルスレッド限定)
ただし、以下の能力は競技プログラミングでは身につけることが出来ないので、これらの能力を得たい場合は追加の勉強が必要になります。
- 特定のプログラミング言語に対する深い理解
- 複数のスレッドを使ったり、GPUを使ったりする高速化
- 機械学習
- 中規模以上で、長く使い続けるプログラムの書き方
- 複数人でのプログラミング
- ハッキング、クラッキング系の能力
- 自分のwebサイトを作る能力
- そもそもプログラミングでは無い能力
- や といった数式を書く能力
- 綺麗なデザイン
なぜ競技プログラミングなのか
プログラミングを勉強しても、すぐにはゲームのようなグラフィックがしっかりとした完成品を作るのは難しいです。一方競技プログラミングは簡単な問題から専門にしている人でもなかなか解けない難しい問題まであるので、勉強すればするほど解ける問題が増え、成長を実感することが出来ます。
また、難しい問題は競技プログラミング向けの知識が必要になってきますが、簡単な問題に必要な知識はゲームプログラミング等の他のプログラミングでも使える基本的な知識であるため、最終的な目標が競技プログラミングでなくてもプログラミングの入門として役立ちます。
さあ始めよう
先ほど問題例として出したAtCoderというサイトは、2019年3月現在日本で一番大きな競技プログラミングの会社です。いまから始めるならばAtCoderで始めると良いと思います。
https://atcoder.jp/
ページを開いたら、右上の「新規登録」からアカウントを作り、practiceでコードの提出方法を確認しましょう。
普段の勉強は、プログラミングの初歩から学ぶ場合はAtCoder Programming Guide for beginnersで勉強すると良いと思います。
競技プログラミングの初歩から学ぶ場合はAtCoder Beginners Selectionがおすすめです。
また、AtCoderで毎週末に開かれるコンテストにも積極的に参加し、自分の実力を示すレートを挙げて、楽しみましょう。
twitterも始めると良いと思います。コンテストが終わった後などは問題に関する感想をつぶやく人も多いので、そういった人をたくさんフォローすると色々な視点から問題を見ることが出来ます。
twitter上ではAtCoderのレートがやたらと高い人がいますが、実際はこんな感じです。twitterで見るほど上の人が多いわけでは無いので安心してください。
明日は syak さんの記事です。お楽しみに。