PythonによるAtcoder：入門者の備忘

# 1. 記事の目的
* あとで見返せる[^1]ようにメモをつくりたかった
    * PythonでAtcoderに参加するとき役立つ記事
    * 個人的意義の検討 
* 想定される読者
    * Progateを終えたくらいの水準から、登録したけど、何を調べればいいのか、と言う段階の方
        * こう考えるやつもいるのだな、という検討の一助になれば
* 業界に詳しくないので至らぬ点ご容赦ください

## 1.1 追記
10/3 8月に最初書いたときから認識の変わった点などについて追記しました。これから限りある時間の中でのアルゴリズムの勉強が始まるので、長い停滞が続きますが、自戒を兼ねて、ほぼ本編には手を入れておりません。

* これまでも拙文お読みいただいた方が思ったよりいらっしゃって、知識ない中での文章、申し訳ないなと思う側面もあります。ぜひ強い人がやさしく書かれた文章をいくつも読んでいただけたらと思います。Qiitaだけでなくブログなどにも参考になる考察をまとめられている方が大勢いらっしゃいます。

* Codeforcesだとブログ機能に、TopCoderだとSlackなどにコミュニティがあるようですが、日本ですとTwitterなどを通じて情報発信されている方をフォローし、かつ近いレートの仲間を持つとよいのかと思います。この問題はこう解いた、解けなかった、というつぶやきをしたり、バチャコンやりませんか、というのは、丁寧にやりとりができれば、歓迎されるのだと思います。



# 2. <a href="https://atcoder.jp/home">Atcoder</a>とPythonのリンク
* 競技プログラミングコンテストのひとつ[^2]
* 国内で一番大きい
* <a href="https://twitter.com/chokudai/status/1016244862344036352">イラスト1枚の要約</a>
* 入門者向けの記事が豊富
    * <a href="https://noimin.hatenablog.com/entry/2017/12/16/230900">AtCoderでの競技プログラミングがもっと楽しくなるサイトまとめ</a>
    * <a href="https://qiita.com/masakinihirota/items/d1ffac54e70a1adf084c">競技プログラミング入門者の成長のためのメモ</a>
* Pythonでも解説記事がたくさんあってどれも参考になってありがたい
    * <a href="https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c">AtCoderで始めるPython入門</a>
    * <a href="https://www.javadrive.jp/python/">Let's プログラミング Python入門</a>
    * <a href="https://note.nkmk.me/python-post-summary/">note.nkmk.me Python関連記事まとめ</a>
    * <a href="http://www.tohoho-web.com/python/">とほほのPython入門</a>
    * <a href="http://tjkendev.github.io/procon-library/python/index.html">yaketake08's 実装メモ (Python)</a>
    * <a href="https://nagiss.hateblo.jp/entry/2019/03/12/012944">Python で AtCoder を遊ぶときに知ってると便利かもしれないこと</a>
* Python競技プログラミングのチートシート（チートシートづくりの参考に）
    * <a href="https://arakan-pgm-ai.hatenablog.com/entry/2019/05/07/000000">Python3プログラミングよく使う構文などのチートシート風まとめ</a>
    * <a href="https://note.com/otupy/n/n1bedb9f36e54">Pythonチートシート</a>
    * <a href="https://note.com/otupy/n/n1bedb9f36e54">Python 競技プログラミング　チートシート自分用</a>
    * <a href="https://qiita.com/_-_-_-_-_/items/34f933adc7be875e61d0">Pythonで使う競技プログラミング用チートシート</a>
    * <a href="http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/contents/cheatsheet_01.html">言語処理のための Python チートシート (1) [ver.0.02]</a>
* 入門後の問題の選び方やテキストの選択についての情報も豊富
    * <a href="https://qiita.com/drken/items/fd4e5e3630d0f5859067">AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～</a>
    * <a href="https://note.com/keisuke_funabiki/n/nec9df628f77c#ejBO1">AtCoder Beginners Selection 徹底解説 【Python】</a>
        * Atcoderの常設問題 <a href="https://atcoder.jp/contests/abs">AtCoder Beginners Selection</a> 
    * <a href="https://qiita.com/drken/items/e77685614f3c6bf86f44">AtCoder 版！蟻本 (初級編)</a>
    * <a href="https://qiita.com/saba/items/affc94740aff117d2ca9">蟻本をPythonで (初級編)</a>
* 無料公開版テキスト
    * <a href="https://sites.google.com/view/ut-python/resource/%E6%95%99%E6%9D%90%E8%AC%9B%E7%BE%A9%E5%8B%95%E7%94%BB">Pythonプログラミング入門 #utpython</a>
    * <a href="https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/245698">プログラミング演習</a>
* Qiita記事、重複する内容を含む、気になったものを列挙
    * <a href="http://youwht.ml/tag_dendou/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0">【競技プログラミング】 Qiita殿堂入り記事</a>
    * <a href="https://qiita.com/ell/items/1f519aff0cdc3cf16284">【Python】競技プログラミング 基本入力まとめ</a>
    * <a href="https://qiita.com/jamjamjam888/items/e066b8c7bc85487c0785">初心者向けAtcoder標準入力セット(python)</a>
    * <a href="https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887">Python文字列操作マスター</a>
    * <a href="https://qiita.com/kyuna/items/8ee8916c2f4e36321a1c">Python3で競技プログラミングする時に知っておきたいtips（入力編）</a>
    * <a href="https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7">pythonの内包表記を少し詳しく</a>
    * <a href="https://qiita.com/ta7uw/items/d6d8f0ddb215c3677cd3">Python標準ライブラリ：順序維持のbisect</a>
* Python上位コーダーのエントリー（関連エントリ含め今後参考にさせていただきたい）
    * <a href="https://qiita.com/Kentaro_okumura/items/a6917572756a2e3c0da9">PythonでAtCoder青になるまで -Pythonで競プロやるときに気をつけること-</a>
    * <a href="https://titianote.blogspot.com/2019/01/atcoder.html">titiaのノート AtCoderで青になるまで</a>
    * <a href="http://prd-xxx.hateblo.jp/entry/2018/12/31/173153">30歳で競プロに目覚めた霊長類のブログ AtCoder青になるまでの軌跡</a>
    * <a href="https://randomthoughts.hatenablog.com/entry/2020/03/22/125303">特異点の向こう AtCoderで青になるまで</a>
    * <a href="https://note.com/salmonize/n/n1a56626acae3">AtCoder青色になるまでにやったこと</a>
    * <a href="https://maspypy.com/atcoder-%E6%A9%992400%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F#toc8">maspyのHP [AtCoder] 橙(2400+)になりました</a>
* その他気になるAtCoderやPythonのTips
    * <a href="http://tatsumack.hatenablog.com/entry/2018/12/09/113908">AtCoderの拡張機能を3つ作った話</a>
    * <a href="https://ikatakos.com/pot/programming_algorithm/contest_history/atcoder">いかたこのたこつぼ Atcoder</a>
    * <a href="https://arakan-pgm-ai.hatenablog.com/entry/2019/05/04/000000">Python3の開発・デバッグにVisual Studio Codeを利用する：Windows10・Anaconda</a>


# 3. 参加まで
* 去年友人に勧められる
    * 「実益を兼ねる趣味になり転職にもいいかもしれないよ」
* モチベーションがなく放置（1年）
* ProgateのPythonコースを1日で終える(2020/7/7)
* 環境構築さえなければプログラミングは敷居低いのでは、と考える（7月前半～）
* Atcoderもまた、始める分には環境構築は要らない
* Atcoderの入門記事<a href="https://atcoder.jp/contests/apg4b">APG4B</a>がよさそう
    * ProgateにはこうしたC++コースは存在しない
    * Progateと同様、即時採点の問題形式
* 直近で8/2(日)にABCがあるからそこまでにAPG4Bを読み進めて、参加もしてみようと考える（7月後半～）

# 4. ABC174, 175参加前後の備忘
* 環境構築はめんどいので放置した
* <a href="https://atcoder.jp/contests/apg4b">APG4B</a>を飯時や寝る前に流し読む
    * 1章を終える
* ABC174はC++でA, B問題を完答する
    * A, B問題は1章の知識で解ける
    * 慣れの必要を実感
    * 1週間放置してAGCを迎えるも、レート1200以下はunrateであるらしいから不参加（8/9）
* 次の方針はどうしたものかとAtcoderのページをカチカチ
    * <a href="https://kenkoooo.com/atcoder/">Atcoder Problems</a>というAtcoder社外のサービスが勧められている
    * “<a href="https://noimin.hatenablog.com/entry/2017/12/16/230900">もっと楽しくなる</a>”にも紹介がある
    * 使って見ると、統計を見ながら遊ぶのは励みになる
    * Pythonに切り替えてBootcamp中心に解く
    * 昼休みに裏紙を使って帰宅後25問解く（8/10～15）
* ABC175はPython（PyPy3）でA, B, Cを完答する（8/15）
    * 3誤答（WA: Wrong Answer）でペナルティー
        * パターン考慮・試行に慣れたい
    * D問題以上も眺める
        * DPやらグラフやらの知識が要る
        * 数式や図説のある基本書が欲しい
        * <a href="https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89%E6%8B%93%E5%93%89/dp/4839941068/">蟻本</a>がいいらしいので買う
        
# 5. なぜPythonを使うか
* 利用者の過半がC++、公式解説もC++、計算速度もC++が一番であることはAtcoderのトップページを始め方々に触れられているのにもかかわらず私がPython[^3]を使いたい理由は5つ：

1. Pythonが好き
2. 環境構築や実装がC++よりずっと楽
3. Pythonで参加する人もC++ほどじゃないけどいる
4. 私の所属の数人はPythonを書けるらしく、今後もPythonがデファクトスタンダードとなりうる雰囲気がある
5. C++に慣れても身の回りでは活用できる場がなさそう[^4]

# -1. 今後の展望
* "<a href="https://qiita.com/masakinihirota/items/d1ffac54e70a1adf084c">成長のためのメモ</a>"にあるとおり：
    * Atcoderは相対レートのネットゲーム
    * 難問は難しさが青天井で、一般的な意味での教育的効果や実用性はほぼないということが公式に言われている
        * <a href="https://atcoder.jp/contests/agc047/standings">AGC 047</a>のFは3人しか正答していない！　とんでもない世界
* 楽しい趣味として・実用として[^5]
* 緩い目的意識・目標設定をおく
    * ひとまずの目標
        * 昼休みに紙上で1問以上方針を立てる⇒家で解くの繰り返し（楽しいからやる）
        * 水泳のほうがよっぽど大事な趣味
        * ほかの時間の使い方も大事に[^6]
    * Atcoderで難しい問題も解けるようにと技法を学び、素早く解けるようにする
        * 参戦記事にときたま見える“やるだけ”が意味するところ
    * プログラミング全般に共通するが経験の無いものから見ると異質に見える技術、工夫のようなものがある
        * 調べる
        * 知見を得る
        * 無駄を省く
        * 環境を整備する
    * レートの目標は持たないつもりだが……
        * 5～10回はレートが正しく反映されず、それまでは集中して地力を高める必要がある
        * さもなくばすぐレートとモチベーションをいたずらに下げることになる
    * 資格的な観点で<a href="https://past.atcoder.jp/">アルゴリズム実技検定（PAST）</a>にチャレンジ？
        * レート上がったら考えてみる
        * <a href="https://qiita.com/kusano_k/items/bbaa7575f68da97a442c">AtCoderアルゴリズム実技検定のすゝめ／サンプル問題の解説</a>
* Atcoderから脱線するが計量経済への応用を備忘記
    * <a href="https://qiita.com/lystahi/items/d3408c1fada1699a1a5b">10分で学ぶAPPELPY - Pythonの応用計量経済学ライブラリ</a>
    * <a href="https://py4etrics.github.io/index.html">Pythonで学ぶ入門計量経済学</a>
    * <a href="https://sites.google.com/site/hirofumikurokawa/home/causal_inference">因果推論のための
計量経済学</a>
    * <a href="https://pyecon.org/down/pyecon.pdf">Pyecon Python for Econometrics</a>
    * <a href="https://www.kevinsheppard.com/files/teaching/python/notes/python_introduction_2019.pdf">Introduction to Python for Econometrics, Statistics and Data Analysis</a>

# 0. 追記（20/9/30）
書いてから日も空いたので認識の改まった点などを挙げます。

## 0.1 しばらくして感じたこと・知ったこと
* じきにC++もやってみたいな～と思います。
    * C++に対して、言語使用やアルゴリズムの調べもののコツ、環境のつくり方とか、ハードルが少しずつ低くなっている印象があります。
    * PythonのMathカテゴリ問題を解き進めるにつれて、じゃあC++ならどうするか？　というのが、見えやすくなったのだと思います。
    * 私のようなこらえ性のない人間でもPythonの緑色レートの初級難度問題くらいまでは（算数に近い問題に限りますが）自然と読み書きができているので、おすすめです。

* ACL（Atcoderが公開した高速な、コンテストで使えるライブラリ集）は、ありがたい存在だと思います。
    * まだ初歩的なことを勉強していますが、じきにこのデータ構造も勉強したい！　と思っています。
    * 品質の保証されたものを提供いただけるというのはすごいことだと思います。
        * いってみれば高速化のチューニングの手間をとらないでいいよ、という特急券のようなものだと思います。

* ほかの人のコードを参照する場合のルールは、YukicoderですとApache License 2.0なのですね。
    * 当然といえば当然ですが、ライブラリなど、出典をする場合はコメントに明記するよう気をつけます。
    * Atcoderでも提出者に著作権がある、という規約ですので、留意しておきます。

*  競プロやAtcoderは楽しんでやりたい。ますます盛り上がってほしい。
    *  競技プログラミングは、海外のプログラマーとも遜色のない技術があります、と言える稀な機会だと思う。
    *  日本人のアルゴリズム構築能力の中央値・平均値が高まることは価値があると思う。
    *  仮にプログラマー人口の裾野が伸びて、技術者が評価・認識される＆国際競争力が高まるようになったらいいなあと思う。
    *  自分がContributeできるところは少ないが、かつての専攻で学んだことが生きないか考えてみたい。

## 0.2 レーティングとコミュニケーション
* わからないことについてコミュニケーションを取る相手は大事だと考えられます。
* もう一歩わからない、という水準のことについて質問する相手は、自分より少し経験を積んだ人に聞くのが、互いに取って一番ためになるのだと思います
* 具体的には、±2色以上離れたレートの人に質問するときは場面を考えたいと思っています（LTなどで自信を持って質問ができそうならまた話は別化とは思います）

## 0.3 方法について書きもらしたこと
* Qiitaは殿堂入り記事のほか、AtcoderタグでLGTM上位のタイトルをチェックされるとよいと思います。
    * 自分の興味のあるアルゴリズムや言語についての問題解説記事を片手に問題を解くのは楽しいです。
* 解いた後の考察、復習、解けなかった問題をもう1問解説を読んでから正答提出する、というのも続けたいと思います。
* 私は素地がないので、毎日過去問を解くのと並行して、本や読み物も読んで、言葉や概念を学んでいます。
    * 問題を解いてその場で理解するのが本当は一番早いです、読むのは趣味もあります。
    * 昔は興味はあるけど入門書すら読むのが苦痛だったので、読み進められるようになったことがうれしいです。
    * テキストに付いては、蟻本をいったん保留して今の自分が読んでためになりそうなものを読んでいます。
        * 『みんなのPython』はおすすめです！　人に勧められたこともあるし、これは試してみたいな、などと考えながら読み進められるワクワクする本でした。しばらく座右に置きたい本です。
        * 昔先行していた分野では読み比べが理解に、厚い本の通読が自信につながったので、アルゴリズムやPythonの良書は2冊目、3冊目を読んで行こうと思っています。
        * 幅広く解説記事を書かれているけんちょんさんの本は10/2に本屋で買いました！　とても楽しみです。

[^1]: 忙しくなって途中でやめてもまた参照できる（弱気）。
[^2]: 大会規模は、直近で1問でも解答の提出のあった者をカウントして、直近で初心者向けが約10000人、上級者向けが約2000人。アクティブユーザで検索すると6万位まで表示される。ただし<a href="https://atcoder.jp/contests/abc175/standings">ABC 175</a>、<a href="https://atcoder.jp/contests/agc047/standings">AGC 047</a>の大会結果を閲覧した。ほかにも、国内外に同様の応答型のコンテストや問題集、あるいはその紹介記事が豊富にある。用語がいろいろあるが、プログラマーは手間を減らす方へ指向性を持っていて、略語の利用、ミーム化はこの業界で好まれると推察する。（<a href="https://www.google.com/search?q=%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0+%E7%94%A8%E8%AA%9E%E9%9B%86">競技プログラミング 用語集🔍</a>）
[^3]: PyPyが計算が速くてよいらしいという記事も方々に見出したのでPyPy3を使う。それでもC++のほうがずっと速い。AtCoderや他のコンテストサイトではC++以外が絶対動くという保証はない。弊社の環境的には、計算速度についての考慮も不要そうだが、仮に、ビッグデータに関して1日中計算を回すようなことがあるならば、あるいは†簡単な計算†はC++で自分で実装しよう、という程度にはC++を使いこなせたら、という想像力は持っておきたい。
[^4]: 分析目的で回すだけの、コードをカッチリ保守する必要のないケースが多そう
[^5]: Atcoderに出されるような大学受験までの算数やアルゴリズムの概念自体は好きだったので、プログラミングにいい思い出がないながらも、まあまあ楽しい。
[^6]: Atcoder Problemsはデザインが洗練されていて凄い。習慣づけるものごと全般に、これくらい楽しく統計を残せるサービスがあればなあ、と思って探している。