AtCoderユーザがCodeforcesに参戦した話

## Codeforcesへの参戦
AtCoderに1年以上取り組んできて、とりあえずの[目標（水色）を達成](https://qiita.com/tosh55/items/4153942b4bac39e0e5a8)しました。そこで、知見を広めるために[Codeforces](https://codeforces.com/)（こどふぉ）に挑戦してみました。AtCoderで使っている環境（Atcoder Problems, VScode, AtCoder Easy Test v2, atcoder-cli, online-judge-tools/oj）からなるべく変えないたくないのでいろいろ調べたり試行錯誤しました。今後挑戦する人の参考になればと思い、記録を残しておきます。

勘違いなどがありましたらご指摘ください。

## Codeforcesとは
AtCoderと並んで世界的に有名な競技プログラミングサイトです。ロシアのサイトで、AtCoderより頻繁（週に2～3回）にコンテストが行われているようです。開始時間が日本時間で23:35になることが多く、また、日本人は基本的に英語で参加することになりますので、それがハードルを上げています。

私が初めて参加する際には、[ぴーよさんの記事](https://ywmt.hatenablog.com/entry/2019/10/17/120914)や[Noiminさんの記事](https://noimin.hatenablog.com/entry/2019/10/18/162521)を参考にさせていただきました。これらの記事から少し時間が経っていますので、いくつか状況が変わっています。私が気づいたことを書いておきます。
- 以前は登録後にレート1500からスタートしたそうですが、今は登録後のレートは0です。もう少しちゃんと書くと、内部レート1400でスタートして6回参加まではそこから決まった値を引いた値が表示レートになるそうです。詳しくは[こちらの記事](https://fairy-lettuce.hatenadiary.com/entry/2020/07/02/024025)を見てください。また、6回目の参加までは trusted participantとして認められず、公式な順位表にも載らないようです。
 
- 最近は、新しいコンテスト種別として、Div 4が追加されたようです。AtCoderのABCのA,Bレベルの問題が出されていて、初心者が参加しやすくなっています（ただし、開催回数はそんなに多くなく、２か月に一回程度）。

- レートの予測値をだしてくれるCF-predictorという名のツールがネットを探すといくつかありますが、~~現在のCodeforcesサイトでちゃんと動くものは私には見つけられませんでした。~~ Chrome拡張機能のCF-Predictorがちゃんと動くのを確認しました。(2023/11/25修正）

## ツールの準備
AtCoderでは、atcoder-cliで問題用のディレクトリ作成、サンプルケースのダウンロード、テンプレートを使ったプログラム用ファイルの用意をしています。VScodeでプログラミングとデバッグをして、online-judge-tools/ojでサンプルケースでの動作確認をします。コンパイルや動作確認はVScode内からショートカットキーで動作させています。提出は、VScodeからプログラムをCopyして、サイト上の提出窓にPasteし、Chrome拡張機能のAtCoder Easy Test v2で必要な場合には確認後、提出ボタンを押して提出します。

Conservativeな私は可能な限り同じやり方でCodeforcesにも参加したいと思いました。調べてみると、atcoder-cliのようなツールとして[cf-tool](https://github.com/xalanq/cf-tool)があるそうです。ですが、ファイル名やディレクトリ構成がatcoder-cliと違うのと、（今試したらうまくいってますが、前試したときは）サンプルケースの入力ファイルの中身がちゃんとダウンロードされていないという問題がありました。そこで、さらに調べてみると、[online-judge-tools/template-generator](https://github.com/online-judge-tools/template-generator)のoj-prepareでatcoder-cliと同じようにCodeforcesからダウンロードできるようです。私には不要なファイル（`main.py`や`generate.py`）もデフォールトで同時作成されるのですが、設定ファイル（`~/.config/online-judge-tools/prepare.config.toml`）を書き換えることで必要な動作だけに限定し、テンプレートファイルも自分のものを指定できることがわかりました。試行錯誤でやっと望み通りになったのですが、後になってここら辺の情報は[こちらの記事](https://atug.tokyo/?p=598)に出ていたのを見つけました。

oj-prepareの使い方ですが、以下の例のようにダウンロードする問題のURLを指定します。
`$ oj-prepare https://codeforces.com/contest/1899`
URLの最後の数字がコンテスト特有で、この値はコンテストに登録（Register)するときのURLを見ればわかります。私の設定ファイルを載せておきます。
```:prepare.config.toml
contest_directory = "./{contest_id}"
problem_directory = "./{problem_id}"

[templates]
"main.cpp" = "main.cpp"
```
同じディレクトリに、テンプレートファイル`main.cpp`が置いてあります。

あと必要なのが、CodeforcesのサイトにプログラムをPasteしてボタンで提出する方法です。問題ページの右側に`Submit`ボタンがあるので、ファイルを選択して提出します。
![submit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780473/bdd0bbc4-af76-1be6-aec0-d5d039d9c024.png)
または、ページ上部に`SUBMIT CODE`というタブがあるのでこれを押してページを切り替えるとPasteして提出できる窓が現れます。ですが、AtCoderでのPasteして1ボタンでの提出に慣れているといかにも面倒でミスもしそうです。Tampermonkey用のスクリプトでそれっぽいもの（たとえば、[cf-fast-submit](https://greasyfork.org/en/scripts/371117-cf-fast-submit)）を見つけてインストールしてみましたが、ページ構成が変わったためかうまく動きません。諦めかけていたところ、なんと[Atcoder Easy Test v2](https://greasyfork.org/ja/scripts/433152-atcoder-easy-test-v2)が使えることに気づきました。この拡張機能により問題ページにコードをPasteする窓と、サンプルテストや提出のボタンが現れます。ただし、コード用の窓が少し小さいです。私は、Atcoder Easy Test v2のソースをちょっとだけいじって、コード貼り付け窓の高さを大きくし、窓のコードをサンプルテストを行わずに直接提出するボタンを追加して使っています。
![sub2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780473/32594a73-59c0-1e1c-0bae-4115f2c39431.png)

あと、ツールでは無いですが、AtCoderの重要なお供として[AtCoder Problems](https://kenkoooo.com/atcoder)があります。Codeforcesで同じようなサイトを探したところ、[Codeforces Problems](https://cf.kira924age.com/)や[tomo727's blog](https://tom0727.github.io/cf-problems/)が見つかりました。本当にありがたいことです。

## 実際に参戦してみて
2023/11/17開催の[Codeforces Round 909 (Div. 3)](https://codeforces.com/contest/1899)と、2023/11/19開催の[Codeforces Round 910 (Div. 2)](https://codeforces.com/contest/1898)に参加してみました。Div. 3はA,B,C,Dの4完、Div. 2はA,Cの2完でした。大雑把に言うと、Div. 3がAtCoderのABCに、Div. 2がARCに対応していると思います。ただし、ABCのA,B問題はあるレベル以上だと「やるだけ」になりますが、Div. 3のA,Bはそれなりに考えないと解けないという違いがあります。本当の初心者にはABCが良いですが、多少レベルアップをすると楽しめるのはDiv. 3のA,B問題だと思います。

CodeforcesのAtCoderには無い特徴として、PretestとHACKがあります。簡単に説明すると、Pretestは本番中の簡易テストで、コンテスト終了後本格的なSystem testが行われて初めて本当のAcceptedとなります。HACKは、他の参加者のPretest通過後のコードを見て、バグを見つけてパスしないようなテストケースを提出する行為です。成功すると加点、失敗すると減点されます（コンテスト種別にも依存します）。

私は、とりあえずどちらも気にしないことにしています。どちらも、出題側が最初に完全なテストケースを用意しきれないときの対策として入れている仕組みだと思います。ですので、私のレベルで気にしてもしょうがない気がします。また、Div. 3では本番終了後12時間がHACKの時間でした(Div. 2では本番中です。でもEducationalと付くと12時間のHACKがあります。(2023/11/25追記))。こんなに時間を掛けていられないです。因みに、今まで6問通した中では、System testでのrejectもHACKもありませんでした。

英語については、私自身はそれなりに英語を読めるのですが、やはり日本語の方が速く楽に読めます。そこで、機械翻訳を試してみましたが、数式混じりの文のせいもあるのか、期待レベルでは訳してくれません。結局、今は直接英語を読んでいます。それから、遅いコンテスト時間ですが、翌日が休みの日にやってくれるコンテストを探して参加すれば大丈夫でした。

コンテストに2回参加してみて、私のレートは882でした。[こちらの記事](https://fairy-lettuce.hatenadiary.com/entry/2020/07/02/024025)によると内部レートより550低く出ているはずなので、内部レートは1432で水色になります。AtCoderの現在のレートは1256で水色なので、色はほぼ対応しているようです。

## 終わりに
Codeforcesに参加してみてあらためて感じたのが、AtCoderの初心者への敷居の低さです。
- 日本語問題
- ABCのA,B問題の本当の初心者向けレベル
- 参加しやすい開催時間
- わかりやすい公式解説放送

が揃って、初心者が参加しやすくしてくれています。私も、AtCoderがなかったらそもそも競技プログラミングに手を出さなかったと思います。

一方で、あるレベル以上（緑か水色くらい）になったら、視野を広げて解く問題数を増やすために、Codeforcesに手を出しても良いかと思います。現在（2023/11/20)のCodeforcesの日本人アクティブユーザ（6か月以内にコンテスト参加）を見ると383名でした。この記事が少しでも新たな参加者の助けになれば幸いです。私自身も最低限trusted participantになるまでは参加を続けようと思います。