来年の事始めに、AtCoderでの競技プログラミングはいかがでしょう？

# 初めに
にゃ～ん。ねこさいんです。
自己紹介で｢競技プログラミング好きです！｣と言うと、興味を持ってくれる方が多くてうれしいです。しかし、「難しそう」というイメージが先行して、なかなか上手にすすめることが難しいため、布教の叩き台を作ろうと思いました。
競技プログラミングでも今回はAtCoder (https://atcoder.jp/home) の話をします。
「難しそう」と思われがちですが、**始めるだけなら本当に簡単にできます！**
本当に"Hello world!"レベルからあります。~~難しい問題はむずかしい、多分どこまで行ってもそれは続く。~~
あとアドベントカレンダーをやってみたかったので筆を執りました。

タイトルは[ E869120「競技プログラミングことはじめ」](https://speakerdeck.com/e869120/20221122-jing-ji-puroguramingukotohazime) リスペクトです。競技プログラミングの位置づけ、意味などはこちらに。

# こんな人に特におすすめです！
- 競技プログラミングが気になる人

- なにかのプログラミング言語で入出力、四則演算、if文とforループができる人
[C++入門 AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/APG4b)に、一通り使う技術が書いてあります。アルゴリズムについては問題解きながら覚えれば大丈夫です。

- 好きな言語に触れたい、動かしたい人
　AtCoderの対応言語は本当にたくさんあります。[Python入門（Python版 APG4b）](https://qiita.com/saba/items/b9418d7b54cce4b106e4)のように、**「任意の言語 APG4b」**で検索すると、有志の方がAPG4bをその言語で書いている場合があり、新しい言語を学んで少し動かしたいときにとても便利です！

    <details><summary>★対象言語（2022年12月5日現在）★</summary>
    C (GCC 9.2.1)  <br>
    C (Clang 10.0.0) <br> 
    C++ (GCC 9.2.1)  <br>
    C++ (Clang 10.0.0)  <br>
    Java (OpenJDK 11.0.6)  <br>
    Python (3.8.2)  <br>
    Bash (5.0.11)  <br>
    bc (1.07.1)	  <br>
    Awk (GNU Awk 4.1.4)	  <br>
    C# (.NET Core 3.1.201)  <br>
    C# (Mono-mcs 6.8.0.105)  <br>
    C# (Mono-csc 3.5.0)  <br>
    Clojure (1.10.1.536)  <br>
    Crystal (0.33.0)  <br>
    D (DMD 2.091.0)	  <br>
    D (GDC 9.2.1)  <br>
    D (LDC 1.20.1)  <br>
    Dart (2.7.2)  <br>
    dc (1.4.1)  <br>
    Erlang (22.3)  <br>
    Elixir (1.10.2)  <br>
    F# (.NET Core 3.1.201)  <br>
    F# (Mono 10.2.3)  <br>
    Forth (gforth 0.7.3)  <br>
    Fortran (GNU Fortran 9.2.1)  <br>
    Go (1.14.1)  <br>
    Haskell (GHC 8.8.3)  <br>	
    Haxe (4.0.3); js  <br>
    Haxe (4.0.3); Java   <br>
    JavaScript (Node.js 12.16.1)  <br>
    Julia (1.4.0)  <br>
    Kotlin (1.3.71)  <br>
    Lua (Lua 5.3.5)	  <br>
    Lua (LuaJIT 2.1.0)  <br>	
    Dash (0.5.8)  <br>
    Nim (1.0.6)  <br>
    Objective-C (Clang 10.0.0)  <br>
    Common Lisp (SBCL 2.0.3)  <br>
    OCaml (4.10.0)  <br>
    Octave (5.2.0)	<br>
    Pascal (FPC 3.0.4)  <br>	
    Perl (5.26.1)  <br>
    Raku (Rakudo 2020.02.1)  <br>
    Prolog (SWI-Prolog 8.0.3)  <br>
    PyPy2 (7.3.0)  <br>
    PyPy3 (7.3.0)  <br>
    Racket (7.6)  <br>
    Ruby (2.7.1)  <br>
    Rust (1.42.0)  	<br>
    Scala (2.13.1)  <br>
    Java (OpenJDK 1.8.0)  <br>
    Scheme (Gauche 0.9.9)  <br>
    Standard ML (MLton 20130715)  <br>	
    Swift (5.2.1)  <br>
    Text (cat 8.28)  <br>
    TypeScript (3.8)  <br>
    Visual Basic (.NET Core 3.1.101)  <br>	
    Zsh (5.4.2)  <br>
    COBOL - Fixed (OpenCOBOL 1.1.0)  <br>
    COBOL - Free (OpenCOBOL 1.1.0)  <br>
    Brainfuck (bf 20041219)  <br>
    Ada2012 (GNAT 9.2.1)  <br>
    Unlambda (2.0.0)  <br>
    Cython (0.29.16)  <br>
    Sed (4.4)  <br>
    Vim (8.2.0460)  <br>
    </details>


# やること
## 0. [AtCoder](https://atcoder.jp/home)に登録
未登録でも問題の閲覧は可能ですが、提出することが出来ませんので、(シークレットモードで確認済)登録を済ませることをお勧めします！
リセット防止のために、アカウント名は1度だけ変えられます。

## 1. [AtCoder Beginners Selection](https://atcoder.jp/contests/practice/tasks)
　A問題だけ解きましょう！これで君も競プロerだ！
通常の提出に加え、コードテストも問題ページで出来ます。お手軽！
手元に実行環境作るのは、復習や確認がやりたくなってからでいいと思います。
（私は最初paiza.ioで実行して、メモ帳にログ残してました。懐かし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601726/c9adbc80-5678-80a4-f87e-76c92332e49a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601726/e65fcda7-9efe-87df-1a23-5c0920a1e249.png)



## 2.[AtCoder Beginners Selection](https://atcoder.jp/contests/abs/tasks)
　けんちょんさん作成、誰しもが通る王道。
1.と同じ最初の問題を含め、3問がA問題、次の5問がB問題、最後の3問がC問題です。
解説とC++でのサンプルコードが以下の記事にあります
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

## 3. [コンテスト](https://atcoder.jp/contests/)に参加してみよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601726/55cdca9b-14c3-dd5f-38ee-e8ed4be417ad.png)
(図：2022年12月5日現在、予定されたコンテスト)
　コンテスト名の横に丸A (Algorithm)と、青い丸の書かれたものがAtCoder Beginner Contest(通称、ABC)です。Begginerといいつつ2000未満のレーティング対象で、熟練者も参加しています。
　通常、ABCは、日本時間の土曜日か日曜日の午後9時から10時40分に開催されることが多いです。
コンテストの開催について、約1週間前ごろ、AtCoderのホームページや[Twitter](https://twitter.com/atcoder)で告知があります。有志による告知などもあるらしいです。
事前登録はコンテストページが出来次第、いつでも可能です。
「参加登録」を押し、RatedかUnratedを押すだけで登録できます！
コンテスト開始後でも、途中参加も可能ですが、Unrated固定になるようです。用事などで途中からの参加でも、Rateが欲しい場合は事前に登録しましょう()。
最初の頃はレーティング変動が少なく、一問も解けなくても大きく評価が下がることはあまりないです。失敗を恐れずにどんどんチャレンジしましょう！

### ルール・答え・他の人の回答
このあたり、私は初めてからしばらくわからなかったのでまとめます。

- [ルール](https://atcoder.jp/contests/APG4b/rules?lang=ja)：記載がない限り個人戦です。制限時間内に多くの問題を解くとスコアが上がります。正解数が同じなら早く解けたほうがスコアが高いです。制限時間内はコンテストの内容についてSNS等でネタバレしてはダメです。
- 解答：コンテスト後に問題の横に「解答」が出現します。youtubeでの解説もあります。
- 「自分の言語の解答が欲しい」：上記解答・解説はC++が多い(最近Pythonも見かける)ため、自分が使っている言語の解答が欲しい場合があるかと思います。
その時は、「提出結果＞すべての提出」から、他の人の提出を見てみましょう。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601726/d22466c4-15a7-fda5-b206-c6f82b21295c.png)
コンテスト問題、言語、結果を指定すると探しやすいです。
たくさんの提出があってどれを見ていいかわからないと思うので、一番古い(＝一番早く解けた)人の解説から数個見てみるのがオススメです。フレームワーク等を使って解いている場合や、変数などがその人流のこともあるため、一番早い人＝一番初心者にとってわかりやすい人ではないので注意。自分が読みやすいな、と思った解答を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601726/3b2e43f2-d109-3f0d-9c45-0c2bc5a34fe7.png)

答えの探し方、コンテスト周りのお役立ち情報について詳しくはけんちょんさんのこちらの記事をどうぞ
[AtCoder コンテストに参加するときの tips](https://qiita.com/drken/items/8a6f139158cde8a61dce#3-atcoder-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE-tips)


## 4. さらにやってみたい人向け
- [AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)で問題を解く
過去のコンテスト問題と、その難易度が表になっています。問題の左の丸にカーソルを合わせると、難易度が数字になって出てきます。例えば、難易度100の問題は、「AtCoderのレートが100の人の正解率が50％と予想される問題」を意味します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601726/0ea90ed4-21b1-8c45-8225-1eb8fd489ca6.png)

- [AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)
記事書きながら読み返していたら、100点・200点問題に必要な知識の勉強方法や、勉強に使える各種サイト・本の紹介などもありました。

- [アルゴ式](https://algo-method.com/)
プログラミングや情報科学についての教科書と、練習問題が載っています。
テーマごとに問題が細かく設定されています。丁寧に体系だてて勉強したい人向け。

- [AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/home)
こちらも競技プログラミング周りの知識の勉強サイト。問題がまずあって、「一般解説」が教科書に該当している。習うよりまず手を動かしたい、でも体系だった練習がしたい人向け。