Pythonで競プロをはじめるにあたって(テスト環境構築編)
はじめに
競プロをAtCoderやAizu Online Judgeから始める際に筆者はPythonでやりたいので、過去問を解くときに、問題に用意されているサンプルのテストや自分自身で考えたサンプルををいい感じにやるローカル環境が作りたかったのでそれらの備忘録。
モチベーションとしては、コードテストもオンラインジャッジ上にあるが、コードテストでサンプル一つ一つやるのは少し面倒出し時間がかかるし、問題文読む以外はテキストエディタで完結したかった。
やりたいこと
- 問題に付随しているサンプルをダウンロードして、自身のコードで読み込んで、ローカルで結果を評価したい。
- コードテストで一つ一つやるのは少し面倒。
- online-judge-toolsという超便利ツールを使うことで解決。いろんなオンラインジャッジに対応している。
- ターミナル分割とVimでやってたけど、VSCodeをこれまで使ってなかったので使ってみた。
扱わないこと
対象
競技プロ用のサンプル実行環境構築
基本的な環境
pyenv環境で適宜用意(現状3.4.3なので合わせる)
サンプル実行環境構築に必要なこと
- Visual Studio Codeをインストール
- extensionからPythonをinstallする。
- デフォルトの状態よりもデバッグ機能やハイライト等機能が充実する
- Shift+Command+Pを押して、「コマンドパレット」にselect interpreterと入力してクリックする。
- 現状インストールされていてVS Codeが認識しているPythonを選ぶことができるので適切なものを選ぶ。
- pyenvで環境準備したらその環境。そうでない場合はもともとインストールされているものなど。
- VSCode上でターミナルからターミナルを開いて、適当にAtCoder用などのディレクトリを用意する。
- AtCoder用などのディレクトリにpyenv環境を設定する
- extensionからPythonをinstallする。
実際のコマンド例として、
# ディレクトリ作成 mkdir -p ~/local/project/oj/atcoder/ # 作業ディレクトリとする cd ~/local/project/oj/atcoder/ # python3.4.3の環境をatcoder_3.4.3として作ったとして pyenv local atcoder_3.4.3
- online-judge-toolsをインストール。(詳細のインストール方法はドキュメント参照)
pip3 install --user online-judge-tools
python3.4.3だとpip3をつかえないが、以下でもインストールできる
pip install --user online-judge-tools
インストールが無事におわって
oj
としてもojなんてないよとか言われたら、ojが謎の場所にインストールされていることがある(Pythonのバージョンをあげて、pip3でインストールすればうまくいくのかもしれない)
which oj
とすればojの場所がわかるので
~/.local/bin/oj
bashrcなりzshrcなりに
export PATH=$HOME/.local/bin:$PATH
と書いて、ターミナルを一度消して、もう一度開き直す。
online-judge-toolsの使い方
上記のように環境を順調に環境を構築してくれば、作業ディレクトリでojと打てば以下のようになるはず。
% oj usage: oj [-h] [-v] [-c COOKIE] [--version] {download,d,dl,login,l,submit,s,test,t,generate-output,g/o,generate-input,g/i,test-reactive,t/r} ...
ドキュメントによると、ログインや提出までできるが、ここではサンプルのダウンロードとサンプルを読み込んで自身のコードをテストする方法を簡易にまとめる。
サンプルのダウンロード
# oj d [オンラインジャッジの問題があるurl] -d [保存しておきたいディレクトリのPATH] # 保存しておきたいディレクトリのPATHが存在しなくても作られる oj d https://atcoder.jp/contests/abc135/tasks/abc135_b -d test/abc135_b oj d https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_A -d test/DSL/DSL_2_A
サンプルを使ってコードのテストをする
# oj t -c "python3 自分が書いた問題の解答pythonコードのPATH" -d [該当する問題のディレクトリのPATH(ダウンロードのしたPATH)] oj t -c "python3 Problems/abc135_b.py" -d test/abc135_b oj t -c "python3 Problems/DSL/DSL_2_A.py" -d test/DSL/DSL_2_A
テスト結果の例
例えば、正解はintで返さないといけないのに、23.0のように小数点を含む形で出力するとWAになる。 そこを直して実行すると、
おわりに
VSCodeで行うと、ターミナルを同じ画面で開きながらできるので、以下がスムーズに行えた。
- コードを書きつつ、ojコマンドを使ってサンプルのダウンロード・テストが行えた。
- コードの途中にprint()をつかっておけばテスト時にその結果も見えるのでデバッグしながらコードを書くことができた。
- 右上の実行ボタンを押すと、自分自身でサンプルを考えて標準入力として入力するテストができた。
- サンプルにはない、条件の範囲だが厳しい内容(例外っぽいもの)などの返り値を確認できた。
ちょっと手間な部分は
- サンプルのディレクトリ管理は自分で適切にやらないといけない。
- 問題のURLのコピペは必要なので、完璧にテキストエディタで完結っていうわけではない。
- ここら辺を解決したAtCoderむけのatcoder-cliというツールもあるらしいので、そのうち試したい
参考記事
Visual Studio Code - Code Editing. Redefined
Introduction to online-judge-tools (Japanese) — online-judge-tools documentation