@Mogobon さんの記事「AtCoderをCUIで提出する環境を整える」を拝読し、
数年前に自分が作ったツールを紹介したいと思い、この記事を書きました。
内容はbashファイルのため、Mac以外でも使えると思います。
以下のCLIツールがインストールされている前提です。
- online-judge-tools
- atcoder-cli
文末に掲載のシェルファイル(atcoder_oj.sh
)を実行すると、atcoder-cli のコマンド等が、
基本1文字のコマンド(関数/alias)で実行できるようになります。
atcoder_oj.sh実行
$ . ./atcoder_oj.sh
変数や関数の設定が終わると、以下のようなバナーが出て、Usage(コマンド例)が表示されます。

コマンドは次のとおり
- atc_login(ログイン)
- start(abcXXXベースフォルダの作成、テストケースのダウンロード)
- a (A問題フォルダに移動、〜G問題 まで同様)
- b
- c
- d
- e
- f
- g
- t(test;現在の問題のテスト)
- s(submit;現在の問題のコード提出)
- atc_logout(ログアウト)
1. login
online-judge-tools と atcoder-cli の両方にログインします。
自分は、ID/Passを上記シェルに書いてしまっています。
> atc_login
2. start
参加するABCと番号を指定します。
これにより、ベースフォルダの作成、テストケースのダウンロードまでを行います。
> start abcXXX
テストケースのダウンロードが完了すると、問題Aのフォルダに自動で移動します。

コマンドプロンプトが、ABC回次、現在の問題 に変わります。
ABCXXX A >
3. test
現在の問題においてテストを実行します。
> t | test
↓ C問題に移動し、C問題をテストしたときのスクショです。
(実行ファイルのパスはシェル内に記述)

4. submit
現在の問題においてソースコードを提出します。
> s | submit
↓ C問題のソースコードを提出したときのスクショです。
(言語と提出するファイルのパスはシェル内に記述)

online-judge-toolsのチェックが厳しいようで、ワーニングが出ますがサブミットできています。
なお、サブミット後にブラウザは開きませんので、必要により手動で開いてください。
5. logout
ログアウトします。
> atc_logout
ログアウトすると、コマンドプロンプトが元に戻ります。
自分は、loginしっ放しで、いちいちlogoutしていません。。。
atcoder_oj.sh コード
先頭の6つの変数を、それぞれの環境に合わせて書き換えてください。
#!/bin/bash
# user-id/passwd for AtCoder
SECTEDUSER="user-id"
SECTEDPASSWD="password"
# language
OJLANG="Swift"
# Online Judge Root folder
OJROOT="$HOME/atcoder/OJ"
# Exceutable file (like a.out) fullpath
OJEXE="$HOME/Library/Developer/Xcode/DerivedData/AtCoder-fbvzrmhzrmdoyxeaszbdjifcteet/Build/Products/Debug/AtCoder"
# source file fullpath
OJSRC="$HOME/atcoder/Swift/AtCoder/AtCoder/main.swift"
#かっこ
LBR="["
RBR="]"
# ansi escape code
#文字色の変数
F_BLACK=$'\033[30m'
F_RED=$'\033[31m'
F_GREEN=$'\033[32m'
F_YELLOW=$'\033[33m'
F_BLUE=$'\033[34m'
F_MAGENTA=$'\033[35m'
F_CYAN=$'\033[36m'
F_WHITE=$'\033[37m'
F_DEFAULT=$'\033[39m'
#背景色の変数
B_BLACK=$'\033[40m'
B_RED=$'\033[41m'
B_GREEN=$'\033[42m'
B_YELLOW=$'\033[43m'
B_BLUE=$'\033[44m'
B_MAGENTA=$'\033[45m'
B_CYAN=$'\033[46m'
B_WHITE=$'\033[47m'
B_DEFAULT=$'\033[39m'
#装飾
ALL_RESET=$'\033[0m'
BOLD=$'\033[1m'
ITALIC=$'\033[3m'
UNDERLINE=$'\033[4m'
BLINK=$'\033[5m'
REVERSE=$'\033[7m'
atc_usage="atc_login | start ABCXXX | a|b|c|d|e|f | t)est | s)ubmit | atc_logout"
alias cdoj="cd $OJROOT;echo -en '${F_CYAN}';atc_pwd;echo -e '${ALL_RESET}'"
function atc_pwd() {
_pwd=`pwd`
echo -e "${F_CYAN}${_pwd}${ALL_RESET}"
}
function atc_cd() {
cd ../$1
problem=`pwd | xargs basename`
contest=`echo $(basename $(pwd | xargs dirname)) | tr '[:lower:]' '[:upper:]'`
task=`echo $problem | tr '[:lower:]' '[:upper:]'`
export PS1="${atc_usage}"$'\n'"${contest} ${REVERSE}${task}${ALL_RESET} >"
atc_pwd
}
alias a="atc_cd a"
alias b="atc_cd b"
alias c="atc_cd c"
alias d="atc_cd d"
alias e="atc_cd e"
alias f="atc_cd f"
alias g="atc_cd g"
#submit
function submit() {
clear
cp $OJSRC .
problem=`pwd | xargs basename`
filename=`echo $OJSRC | xargs basename`
contest=`echo $(basename $(pwd | xargs dirname)) | tr '[:upper:]' '[:lower:]'`
url="https://atcoder.jp/contests/${contest}/tasks/${contest}_${problem}"
oj s --no-guess -y --no-open -l $OJLANG --wait 1 $url $filename
}
alias s=submit
#test
function test() {
clear
set -x
oj t -c "$OJEXE" -d tests
set +x
}
alias t=test
#testcase download
function testcase() {
cd ../a;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_a
cd ../b;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_b
cd ../c;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_c
cd ../d;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_d
cd ../e;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_e
cd ../f;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_f
cd ../g;oj dl -d tests https://atcoder.jp/contests/$1/tasks/$1_g
cd ../a
}
#start
function start() {
clear
acc contest $1
acc tasks $1
acc new $1 -c all
cd $1/a
atc_cd a
}
#login
function atc_login() {
clear
echo -e "userid" $REVERSE$SECTEDUSER$ALL_RESET/$REVERSE$SECTEDPASSWD$ALL_RESET "is used."
echo -n "${SECTEDPASSWD}" | pbcopy
#login
set -x
acc login
oj login -u $SECTEDUSER -p $SECTEDPASSWD https://atcoder.jp/
set +x
}
#logout
function atc_logout() {
clear
oj_jar_dir="$HOME/Library/Application Support/online-judge-tools"
timestamp=`date -r "$oj_jar_dir/cookie.jar" "+%Y%m%d%H%M%S"`
set -x
acc logout
mv "$oj_jar_dir/cookie.jar" "$oj_jar_dir/cookie.jar_$timestamp"
set +x
export PS1="$OLDPS1"
}
OLDPS1="$PS1"
echo -en $ALL_RESET
clear
figlet AtCoder-CUI #brew install figlet
echo
cdoj
export PS1="$atc_usage"$'\n'">"
シェルファイルを書き慣れていないので、どんくさい書き方をしている箇所があると思います。
各自、ご自由にカスタマイズして使ってください。
関連記事;