AtCoder の CUI ツールをもっと便利にするシェル

@Mogobon さんの記事「[AtCoderをCUIで提出する環境を整える](https://qiita.com/Mogobon/items/4c757955b9d3c48c8ec1)」を拝読し、
数年前に自分が作ったツールを紹介したいと思い、この記事を書きました。


https://qiita.com/Mogobon/items/4c757955b9d3c48c8ec1

内容はbashファイルのため、Mac以外でも使えると思います。
以下のCLIツールがインストールされている前提です。

- online-judge-tools
- atcoder-cli

文末に掲載のシェルファイル(`atcoder_oj.sh`)を実行すると、atcoder-cli のコマンド等が、<br>基本1文字のコマンド（関数/alias）で実行できるようになります。

# atcoder_oj.sh実行

```terminal
$ . ./atcoder_oj.sh
```

変数や関数の設定が終わると、以下のようなバナーが出て、Usage（コマンド例）が表示されます。

<img width="400" alt="fst.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4dc21492-051f-023f-5b0d-ce4a7fa52380.png" />

コマンドは次のとおり

- 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を上記シェルに書いてしまっています。

```terminal
> atc_login
```

## 2. start

参加するABCと番号を指定します。
これにより、ベースフォルダの作成、テストケースのダウンロードまでを行います。

```terminal
> start abcXXX
```

テストケースのダウンロードが完了すると、問題Aのフォルダに自動で移動します。

<img width="400" alt="fst2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2e1fc99a-e880-0033-f249-1d898fd8021f.png" />

コマンドプロンプトが、ABC回次、現在の問題 に変わります。
`ABCXXX A >`


## 3. test

現在の問題においてテストを実行します。

```terminal
> t | test
```

↓ C問題に移動し、C問題をテストしたときのスクショです。
（実行ファイルのパスはシェル内に記述）

<img width="400" alt="fst3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ddc6b1b2-ddec-90ae-82f4-8feac120e091.png" />



## 4. submit

現在の問題においてソースコードを提出します。


```terminal
> s | submit
```

↓ C問題のソースコードを提出したときのスクショです。
（言語と提出するファイルのパスはシェル内に記述）

<img width="400" alt="fst4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b387ba97-d1b5-725e-da0d-48f63421c726.png" />

online-judge-toolsのチェックが厳しいようで、ワーニングが出ますがサブミットできています。
なお、サブミット後にブラウザは開きませんので、必要により手動で開いてください。

## 5. logout

ログアウトします。

```terminal
> atc_logout
```

ログアウトすると、コマンドプロンプトが元に戻ります。

自分は、loginしっ放しで、いちいちlogoutしていません。。。

# atcoder_oj.sh コード

先頭の6つの変数を、それぞれの環境に合わせて書き換えてください。

```shell:atcoder_oj.sh
#!/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'">"
```

シェルファイルを書き慣れていないので、どんくさい書き方をしている箇所があると思います。
各自、ご自由にカスタマイズして使ってください。

---

関連記事；

https://qiita.com/nak435/items/4854a10a766a8a289aaf