Atcoder専用自動化ツール：

# **Atcoder Contest** の諸々を自動化するコマンドラインツールを作ってみました

対応言語：C++, Python

# できること
- コンテスト用ディレクトリとファイル（雛形）の自動生成
- サンプル入出力のダウンロード
- サンプル入出力を使った、コードの自動テスト
- テスト結果の視覚化
- コードの自動提出

この手のツールによくある機能は一通り備えていると思います

# 類似ツールとの差別化：`シンプルな使い心地`　を追求
- `ワンコマンドで完結`するので、問題を解く以外の作業に頭を使いません。
- テスト用コマンドを実行、テスト結果を判定、提出用コマンドを実行　といった本質的ではない作業をまとめて自動化します。
- ヒューマンエラーが生じやすい作業 = 本質的ではない作業　を排除

# 実行例
実行コマンドと実行結果の画像をいくつか掲載しています。
以下、ABC232 A問題を題材としました。

### テストも提出結果もうまくいったとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612826/21b0b6a4-f2c7-2228-6d69-596e704b922f.png)

### テストが一部正解だったとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612826/3e2c86d4-e31d-63e6-f44a-0d7127e0dbb0.png)
ACのケースは回答を出力しません。優先度が低いため。
判定結果を色分けすることで視覚的に分かりやすくしています。

### テストケース１だけチェックしたいとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612826/5e3bc8b3-0932-3c68-c3d3-b16ee14becdb.png)
情報量を減らしたいときは特定のテストケースだけ確認できます

### 強制的に提出して不正解だったとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612826/7b936cc7-a079-6004-78c5-11d209db4a88.png)
提出してACではなかったら、提出結果のURLを出力します。vs code ではリンクを押すと飛べます。

# 導入方法
Ubuntu20lts on WSL環境を想定しています。ほかの環境の場合は適宜読み替えてください。
WSL環境の構築方法は[ほかの方の記事](https://qiita.com/AokabiC/items/e9312856f588dd9303ed) に詳しくまとまっています。

### github repositoryを好きな場所にクローン
```
git clone https://github.com/hiranoo/AtcoderContestTool
```
### act_config.jsonを作成
```
cd hogehoge/AtcoderContestTool/sample
cp act_config.json.sample act_config.json
vi act_config.json

以下4項目について、'hogehoge' となっている部分をご自身の環境に合わせて書き換えてください
- username
- password
- basedir_path（コンテスト用の作業ディレクトリの絶対パス）
- app_path（git clone した場所の絶対パス）
```

### main.py 15行目を書き換え
引数のパスを、本リポジトリをクローンした場所で書き換える

### aliasを設定
```
vi ~/.bashrc

alias act='/hogehoge/AtcoderContestTool/sample/main.py'
```
- ファイル末尾に追加
- hogehogeは、AtcoderContestTool repository をクローンした場所の`絶対パス`

次のコマンドを実行して、設定を反映

```
source ~/.bashrc
```

### python library を整備
適宜インストールしてください。インストールコマンド↓

```
sudo apt install -y LIBRARY
```

使用しているlibrary一覧（標準パッケージ含む）

- abc
- os
- sys
- glob
- shutil
- time
- subprocess
- bs4
- multiprocessing
- argparse
- json
- requests
- pickle

### templateファイルの変更（OPTIONAL）
雛形となるファイルをご自由に書き換えてください
言語は不問です。

- 雛形ファイル：AtcoderContestTool/sample/template.cpp
- ファイル名を変えた場合は、AtcoderContestTool/sample/act_conf.json の "env"."template_filename"を変更


# 使用方法
例として、`Atcoder Beginner Contest 200` に参加する方法を説明します。
※ABC, ARC, AGC 以外の一部のコンテスト（PASTなど）では自動提出ができないことがあります（修正中）

#### 参加したいコンテストのトップページに行き、コンテスト名を入手します。

```
https://atcoder.jp/contests/hogehoge
hogehoge をコンテスト名とみなします。
```

`Atcoder Beginner Contest 200`の場合は、`abc200` がコンテスト名です。


#### コンテスト名を登録（登録作業は一度だけ）。スクレイピングのため時間がかかります。（問題数×1秒くらい）

```
act --init abc200
```
※ コンテスト開催前はAtcoderコンテストページの詳細にアクセスできないのでコマンドが失敗します。
※ コンテスト開催中なのにコマンドが失敗する場合は、コンテスト名が間違っている可能性があります。

#### 好きな問題を解いてください

#### 問題を解き終わったら以下コマンドを実行しましょう。提出まで自動で行ってくれます。

```
act
```
このコマンドを実行すると以下の処理が行われます。
- 直前まであなたが作業していたファイルを特定
- コンパイルが必要な言語で、コンパイルが終わっていない場合、コンパイル。コンパイル失敗時にはエラーメッセージを標準出力して終了。
- テストでは、サンプルごとにAC, WA, RE, TLE の判定を行い、結果をファイルに保存。並列処理により高速化しているので、手動テストに比べてテスト時間を大幅に削減。
- テスト結果を標準出力： AC, WA, RE, TLE を色文字で表示するので、ぱっと見で分かりやすくなっています。WA時には誤答と正答を表示。
- すべてのサンプルをACすれば、そのまま提出されます。

# その他の使用方法（抜粋）
- とりあえずテストだけ行いたい、特定のサンプルだけ結果を見たい　（提出はしない）

```
act -c サンプル番号
```

- 解が一意に定まらない問題では、強制的に提出してください

```
act -s
```

- より詳しいオプションの説明は次のコマンドで確認できます

```
act -h
```

# 最後に

### ツールが欲しくなった理由
- typoや、デバッグ用コードの消し忘れ、手動テスト漏れゆえのペナルティが頻発していたため
- 出力が長いサンプルで、肉眼による正誤判定を間違えることが多かったから
- コードの誤り と コード以外の提出作業のミス の判別に頭を使うのが不毛だと気付いたから

### 既存ツールを使わなかった理由
- 100% 自分好みの機能が欲しかったから
- そのために既存ツールのラッパーを作るくらいなら、まるごと作る方が勉強になると思ったから
- オブジェクト指向とデザインパターンを勉強していて、そのアウトプットをしたかったから。

### 質問・バグ報告等ございましたら、コメント欄にお願いします。