LoginSignup
1
2

@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(コマンド例)が表示されます。

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

> atc_login

2. start

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

> start abcXXX

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

fst2.png

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

3. test

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

> t | test

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

fst3.png

4. submit

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

> s | submit

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

fst4.png

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

5. logout

ログアウトします。

> atc_logout

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

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

atcoder_oj.sh コード

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

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'">"

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


関連記事;

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2