Atcoder Contest の諸々を自動化するコマンドラインツールを作ってみました
対応言語:C++, Python
できること
- コンテスト用ディレクトリとファイル(雛形)の自動生成
- サンプル入出力のダウンロード
- サンプル入出力を使った、コードの自動テスト
- テスト結果の視覚化
- コードの自動提出
この手のツールによくある機能は一通り備えていると思います
類似ツールとの差別化:シンプルな使い心地
を追求
-
ワンコマンドで完結
するので、問題を解く以外の作業に頭を使いません。 - テスト用コマンドを実行、テスト結果を判定、提出用コマンドを実行 といった本質的ではない作業をまとめて自動化します。
- ヒューマンエラーが生じやすい作業 = 本質的ではない作業 を排除
実行例
実行コマンドと実行結果の画像をいくつか掲載しています。
以下、ABC232 A問題を題材としました。
テストも提出結果もうまくいったとき
テストが一部正解だったとき
ACのケースは回答を出力しません。優先度が低いため。
判定結果を色分けすることで視覚的に分かりやすくしています。
テストケース1だけチェックしたいとき
強制的に提出して不正解だったとき
提出してACではなかったら、提出結果のURLを出力します。vs code ではリンクを押すと飛べます。
導入方法
Ubuntu20lts on WSL環境を想定しています。ほかの環境の場合は適宜読み替えてください。
WSL環境の構築方法はほかの方の記事 に詳しくまとまっています。
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% 自分好みの機能が欲しかったから
- そのために既存ツールのラッパーを作るくらいなら、まるごと作る方が勉強になると思ったから
- オブジェクト指向とデザインパターンを勉強していて、そのアウトプットをしたかったから。