動機
久しぶりに AtCoder に取り組むにあたって、online-judge-tools が動かなくなっていたので、これを機に環境をいろいろ再構築してみました
やったこと
継続
- online-judge-tools と atcoder-cli でコーディング環境を作った
- シェルコマンドで更なる利便化を図った
新規
- online-judge-tools を再インストールした
- online-judge-template-generator を導入し、atcoder-cli から呼ぶようにして問題文を解析して柔軟なテンプレートが作られるようにした
online-judge-tools + atcoder-cli
記事が沢山あるので割愛します
online-judge-tools の再インストール
久々に使用したところ ModuleNotFoundError: No module named 'xxx'
とエラーが出力され使用できませんでした
pip3 uninstall online-judge-tools; pip3 install online-judge-tools
で再インストールしても改善せず…
公式にあるように、強制的に再インストールすることで解決しました
Python 環境が壊れているとの事です
参考:oj/INSTALL.ja.md at master
pip3 install --force-reinstall online-judge-tools
online-judge-template-generator の導入
以前は、atcoder-cli のテンプレート機能を使っていましたが、atcoder-tools の問題文の解析による柔軟なテンプレート作成機能を試してみて、これは良さそうだと思いました
いろいろ Github を巡っていて、同等の機能が online-judge-tools の派生プロジェクトの online-judge-template-generator で出来る事が分かったので、導入してみました
atcoder-cli には、online-judge-template-generator と連携する機能はありませんが、任意のコマンドを実行できるため、それを使って組み込みました
まぁ issues に作者さんが書かれている内容、ほとんどそのままですが…
参考:Issue #25
1. インストール
pip3 install online-judge-template-generator
2. 独自のテンプレートを用意する
デフォルトのテンプレートを使用するなら不要です
atcoder-cli のテンプレートフォルダに置くことにしました
cd `acc config-dir`/py
code main_gen.py
3. atcoder-cli の template.json を設定する
{
"task": {
...
"cmd": "oj-template -t $TEMPLATE_DIR/main_gen.py `acc task $CONTEST_ID $TASK_ID | awk -F ' ' '{print $NF}'` > main.py"
}
}
acc task
で取得できる問題名にスペースが含まれている事があったので、awk
のパラメタを $NF
にしました
デフォルトのテンプレートを使用する場合は、-t
のパラメタを変更してください
4. テストケースを取得する
後はテストケースを取得すればOKです
acc n abc100
シェルコマンド
コードのテストも acc
と同じ感覚で実行できるように、ラッピングするシェルコマンドを作りました
またフォルダを指定するだけで、main.py
をエディタで起動したり、提出できるようにしています
#!/bin/bash
set -eu
# atcodr-cliラッパー
# 引数チェック
: $1
if [ $1 = "-h" ]; then
echo "Usage: acb [command]"
echo ""
echo "Commands:"
echo " new|n [options] <contest-id> create new contest project directory"
echo " add|a [options] add new directory for the task in the project directory"
echo " edit|e <task-dir> open main.py by VS Code"
echo " test|t <task-dir> check main.py with tests"
echo " submit|s <task-dir> [options] [filename] submit the program"
exit 0
fi
if [ $1 = "new" -o $1 = "n" ]; then
acc new ${@:2}
echo
echo "[@] create <$2> directroy."
ls
exit 0
fi
if [ $1 = "add" -o $1 = "a" ]; then
acc add ${@:2}
echo
ls -1td */ | sed 's/\///g' | head -n1 | echo "[@] create <$(cat)> directory"
ls
exit 0
fi
if [ $1 = "edit" -o $1 = "e" ]; then
# シェルスクリプト内でのcdは呼び出し元のシェルには影響しない
: $2
cd $2
echo "[@] open <$2/main.py> file"
code main.py
exit 0
fi
if [ $1 = "test" -o $1 = "t" ]; then
: $2
cd $2
oj t -c "python3 main.py" -d ./tests/
exit 0
fi
if [ $1 = "submit" -o $1 = "s" ]; then
: $2
cd $2
acc submit ${@:3}
exit 0
fi
まとめ
AtCoder の環境を再構築して、更に online-judge-template-generator を導入しました
緑色目指して、コツコツやろう!