1. はじめに
この記事は、競技プログラミング(競プロ)の生産性向上についてとその方法についてまとめたものです。
また今回は、競技プログラミングの中でもAtCoder上の生産性向上に絞りたいと思います。
私が取り入れているものを紹介していくので、他にみなさんが行っているものがあればコメント等でぜひ教えてください!
記事の構成はこのようになっています。
少し長いですが気になるものだけでも見ていただけると嬉しいです!
- はじめに
- 競技プログラミングとは
- 競技プログラミングの生産性向上にいついて
-
「共通部分(コンテスト中&精進中)」における生産性向上の方法
5. ライブラリ作成&スニペット化
6. デバックをスムーズにする工夫 -
「コンテスト中」における生産性向上の方法
6. コンテスト中にパフォーマンスを可視化「ac-predictor」
7. 順位表の情報を分かりやすくグラフ化「AtCoderStandingsAnalysis」
8. コンテスト前準備 -
「精進中」における生産性向上の方法
7. 毎日精進を継続させる工夫
8. 提出一覧のユーザ名を色付け「AtCoder Submission User Colorizer」
9. テストケースのリンクを追加「AtCoder TestCase Extension」
10. 問題にDifficultyを表示「AtCoder Difficulty Display」
11. コンテスト成績表のパフォーマンスとレートを色付け「AtCoderPerformanceColorizer」 - 生産性向上方法のまとめ
- おわりに
2. 競技プログラミングとは
競技プログラミングとは、「与えられた問題を解決するためのプログラミング技術(速度や正確さ)を競うもの」です。
コンテスト時間は、数時間のものから1ヶ月ほどのものまで様々です。
今回対象とするAtCoderでは2時間前後のものが多くなっています。
競技プログラミングの詳細や楽しさについては下記サイトが分かりやすかったです。
メリットも多い競技プログラミングについて詳細解説!
3. 競技プログラミングの生産性向上について
ここから本題に入っていきたいと思います。
最初に競プロの生産性についてですが、競プロは大きく、「コンテスト中」と「精進中」に分かれます。
コンテスト中とは、名前の通り競技プログラミングのコンテストが開催されているときに競プロの問題を解くことです。
精進中とは、コンテストで高いパフォーマンスを出すために、日頃から競プロの問題を解き、自身のスキルを高めていくことです。(いわゆる「練習」ですが、競プロ界隈ではこのことを「精進」と呼んでます。)
そのためそれぞれの生産性向上をこのように考えていきたいと思います。
フェーズ | 生産性向上とは |
---|---|
コンテスト中 | コンテストで高い順位を出すために速度と正確さを高めること。 |
精進中 | 実になる方法でできるだけたくさんの問題を解くこと。 |
次以降の章で、「共通部分(コンテスト中&精進中)」と「コンテスト中」と「精進中」における生産性を向上する方法についてまとめていきます。
生産性向上というより効率化に入る方法もありますがご了承ください。
P.S.
AtCoder公式の便利リンク集に記載されているものは今回は取り上げてないです。
便利リンク集の中だと、「AtCoder Problems」という過去問がまとまっており、自身の回答状況が分かりやすくまとまっているサイトは毎日お世話になっています。
4. 「共通部分(コンテスト中&精進中)」における生産性向上の方法
この章では、「共通部分(コンテスト中&精進中)」における生産性向上の方法についてまとめていきます。
4.1 ライブラリ作成&スニペット化
競プロは速度と正確さが大切です。
そのため、ライブラリを用意しておき、そしてスニペット化しておくことで、時間短縮と凡ミスを排除できます。
アルゴリズムを考える部分に集中できるのでこれはぜひ実践してみてください!
手順としては、
- よく使うアルゴリズムを発見
- ライブラリ作成
- スニペット化
になるかと思います。
私がよく使うアルゴリズムとそのコードを、AtCoderの緑色レートになった時にまとめているのでぜひご利用ください!(Python, PyPyでのライブラリとなってます。)
【AtCoder】普通の人である私が緑になるまでにしたこと - 5. 持ってるライブラリ -
スニペットの手順は下記サイトを参考にすれば分かりやすいです!
VSCode対象となっていますが、他のIDE・エディタでもスニペット設定はできると思います。
スニペットの登録が分かりづらかったり、手間だったりするならば、ライブラリ化までしておくだけで良いと思います!(スニペット化はさらに時間短縮するための手段でしかないため、ライブラリ化ほどは重要度が高くない)
4.2 デバックをスムーズにする工夫
競プロではデバックを何回も行うため、デバックをやりやすくする工夫は必須だと思っています。
こちらもIDEや使用言語などの環境によって変わる部分は多いと思っていますが、どの環境でもある程度共通しているのかなとも思うので簡単にまとめたいと思います。
下記の様にwork
ディレクトリで競プロの作業を行っているものとします。
その配下に、提出するコードを書いていくsubmit.py
ファイルと、入力ケースを格納するinput.txt
ファイルがあります。
work
├ submiit.py
└ input.txt
**ファイルイメージはこちら!**
n, m = map(int, input().split())
ans = n * m
print(ans)
2 3
この時に
$ python3 submit.py < input.txt
とすれば、
6
と出力が返ってきます。
このコマンドラインで入力ファイルを<
で渡すことをせずに、
work
└ submiit.py
というディレクトリ構成で、
$ python3 submit.py
とすれば、
2 3 ←これらを都度入力しないといけない。
6
といった具合に毎回コマンドライン上で入力をしないといけません。
この積み重ねが何回もデバックを行う競プロだと効いてくるので大事になってくるのかなと考えています。
P.S.
テストケースがすべて通ったら自動で提出するツールもいくつかありますが、細かなデバックがしづらいことやパフォーマンスに強く依存する提出する行為をツール依存にしたくはなかったので私は取り入れてないです。(これは個人的な意見でツール自体は良いものだと思っています。)
そのため自動提出や自動テストまでしたくなったら自分でツールを作る気がしてます。(いつになることやら)
5. 「コンテスト中」における生産性向上の方法
この章では、「コンテスト中」における生産性向上の方法についてまとめていきます。
この章以降は、Greasy Forkというユーザスクリプトサイトの拡張機能がでてきます。
Greasy Forkのトップページに導入手順が記載されてますので手軽に利用できます。
この記事で取り上げているので気に入ったユーザスクリプトが見つかったらぜひ導入してみてください!
5.1 コンテスト中にパフォーマンスを可視化「ac-predictor」
コンテスト中に参加者全員のパフォーマンスを推定することで、リアルタイムで現時点でのパフォーマンスとレート変化を表示位してくれるものです。
コンテスト後のレート発表のわくわく感は若干損なわれますが、コンテスト中にパフォーマンスが分かることで問題を解く順番を臨機応変に変更できるので個人的に必須レベルだと思っています。
また、コンテスト後に順位表を眺める際に、このくらいの速度でこの問題数を解けばこのくらいのパフォーマンスがでるんだなというのが順位表を見るだけで分かるので学びにもなります。
AtCoder系の拡張機能で一番使用されている気がします。
以下のページから導入することができます。
https://greasyfork.org/ja/scripts/369954-ac-predictor
5.2 順位表の情報を分かりやすくグラフ化「AtCoderStandingsAnalysis」
コンテスト中に順位表の情報をまとめてグラフ化してくれるものです。
私はまだあまり使いこなせてないのですが、ペナ率や解いている方のレート帯が分かるため、提出する前にペナ率が高いものは再度見直すなどの対応ができれば、誤答によるペナルティを減らしていけそうです。
こちらの拡張機能は比較的新しめのものですがビジュアライズが分かりやすいので気に入ってます!
ただ以下の様に拡張機能ページに注意事項があるので、コンテスト中にこのツールから得た情報をSNSに投稿しない様に気をつける必要はあります。(そもそもコンテスト中にSNSをする余裕を持つのが難易度高いのですが。。。)
念のため、コンテスト中にこのツールから得た情報はSNSに投稿しないでください。
以下のページから導入することができます。
https://greasyfork.org/ja/scripts/398439-atcoderstandingsanalysis
5.3 コンテスト前準備
コンテスト中の生産性を上げるためにはコンテスト前の準備が大切です。
競プロは相当頭を使うので万全の状態で挑むのが良いと思っています。
私がコンテスト前にしていることや、気をつけていることは以下の通りです。
- 飲酒は絶対にしない
- 食事はコンテスト開始1時間前に終わらせる
- 食器洗いを終わらせる(気分的にすっきりします。)
- 仮眠を20分程度とる
- チョコレートをコンテスト直前に食べる
- アロマをたく(多分効果ないです。気分の問題です。)
効果が分かりにくいものもありますが、こういったものはルーティーンの問題なので、あまり崩さない様にしています。
みなさんならではルーティーンを見つけて、ぜひ教えてください!
6. 「精進中」における生産性向上の方法
この章では、「精進中」における生産性向上の方法についてまとめていきます。
6.1 毎日精進を継続させる工夫
競プロは精進しただけ成長するといっても過言ではないので精進を継続させる工夫はとても大切です。
私は毎日ACを競プロを始めてから継続しています。
この毎日ACが途絶えてしまうと、おそらくモチベーションが下がり、その後の精進継続が困難になりそうなため、途切らせない様に気をつけています。
途切らせない工夫としては、
- 日が変わった瞬間に問題を解く(仕事終わりに精進できない時があるので、仕事前にしておくと気分的に楽です。)
- 精進していない日には、23時半にSlackでメンションがくるようにしている(この仕組みにいついて需要ありそうであれば別で記事にします。)
- 精進に時間が取れる時は難しめの問題を解き、忙しい時に簡単の問題を解けるようにしておく
あたりです。
私はこの仕組みで途切れる気がしていないのでぜひ取り入れてみてください!(途切れるとしたらそれは競プロに飽きた時)
6.2 提出一覧のユーザ名を色付け「AtCoder Submission User Colorizer」
提出一覧ページのユーザ名に色付けをするものです。
提出一覧ページで他の人の解答コードを参考にすることは多々あると思うのですが、このレート帯の書き方を参考にしようという際にとても役立ちます。
人によって解答コードが違うのはもちろんなのですが、レート帯によっても解答コードが大きく違うので参考にして勉強になります!
以下のページから導入することができます。
https://greasyfork.org/ja/scripts/397710-atcoder-submission-user-colorizer
6.3 テストケースのリンクを追加「AtCoder TestCase Extension」
AtCoderが公式で出しているテストケースへのリンクを解答ページに表示してくれるものです。
いくつかのケースだけACできないといった場合に、コーナーケースが分かるので解説AC前にテストケースを見てみるのが良いのかなと思っています。
以下のページから導入することができます。
https://greasyfork.org/ja/scripts/371832-atcoder-testcase-extension
6.4 問題にDifficultyを表示「AtCoder Difficulty Display」
問題ページにDifficultyを表示するものです。
精進方法のベストプラクティスは人によって違うので参考になるかは分かりませんが、私はDifficultyベースで精進をすることが多いので問題ページに表示してくれることは手間的な面でとてもありがたいです!
以下のページから導入することができます。
https://greasyfork.org/ja/scripts/397185-atcoder-difficulty-display
6.5 コンテスト成績表のパフォーマンスとレートを色付け「AtCoderPerformanceColorizer」
コンテスト成績表のパフォーマンスとレートに色付けを行ってくれるものです。
こちらはあまり生産性とは関係がなさそうですが、成績表を見ること、またそこに色付けを行ってくれていることで、私はモチベーションが上がり精進の効率が向上します!
以下のページから導入することができます。
https://greasyfork.org/ja/scripts/371693-atcoderperformancecolorize
7. 生産性向上方法のまとめ
以上の章で書いた生産性向上方法についてのまとめです。
リンクになっているので、気になるものがあれば再度見てみて取り入れてみてください!
8. おわりに
以上が私が行っている競技プログラミングの生産性向上についての考えと、その方法でした。
冒頭でも述べましたが、他にみなさんが行っているものがあればコメント等でぜひ教えてください!
ここまで読んでいただきありがとうございました!
競技プログラミングには現在も取り組んでいるので、随時アップデートしていきたいと思ってます。