atc ~ AtCoder Command Line Tool ~
この記事は IPFactory Advent Calendar 2022 の 5日目の記事です。
atc
atcはコマンドライン上でAtCoderへの回答の提出などを行うためのツールになります。
https://github.com/DuGlaser/atc
作ったきっかけ
前まではcargo-atcoderというツールが非常に使いやすく、このツールのためにRustで競プロをしていたのですが、いろいろな理由によりC++で競プロをしたくなりました。
ただ、今まで使っていたcargo-atcoderはもちろん使えなくなるので、他のコマンドラインツールを探して試してみたりしたのですが、ちょっと自分の求めているものと違かったりしてモヤモヤしたので自分で1から作ることにしました。
そうして出来上がったのがatcです。
基本的なコマンドの紹介
文章だけだとイマイチイメージがつかないと思うのでまずは基本的なコマンドの紹介をします。
new
newコマンドはコンテスト用のディレクトリを作成するためのコマンドになります。
atc new abc001
のように実行することで指定したコンテスト用のディレクトリを作成します。
上の例ではabc001
コンテスト用のディレクトリを作成しています。
コマンドを実行するとabc001
という名前のディレクトリが作成され、以下のような構成になります。
. ├── a │ └── main.cpp ├── b │ └── main.cpp ├── c │ └── main.cpp ├── contest.toml └── d └── main.cpp 4 directories, 5 files
私はC++を使いたいのでmain.cpp
を作成するようにしていますが、これはatcの設定で変えられるようにしています。
また、作成されるmain.cpp
には予め設定で指定したテンプレートを書き込むようにしています。
test
testコマンドは特定の問題のテストケースを実行し、期待している出力と同じかどうかを判定するコマンドになります。
submit
submitコマンドは特定の問題の回答を提出するコマンドになります。デフォルトではテストケースがすべて通ったときのみ提出するようにしています。
その他
他にもいくつかコマンドがあります。詳しくはhelpで確認できます。
Atcoder command line tool Usage: atc [command] Available Commands: browse Open problem in browse completion Generate the autocompletion script for the specified shell config Create and edit atc config handle Manual execution code help Help about any command info Output the information of logged in users login Login to AtCoder logout Logout to AtCoder new Create contest project submit Submit answer test Test answer version Print the version number of atc. Flags: --config string config file (default is $HOME/.config/.atc.toml) -h, --help help for atc -t, --toggle Help message for toggle -v, --verbose Make the operation more talkative --version version for atc Use "atc [command] --help" for more information about a command.
こだわり
ショートカットを用意してる
いちいちコンテスト中にsubmit
やtest
と打つのがめんどくさいので、s
やt
などのように頭文字をサブコマンドに割り当てていたりします。割と便利。
特定の言語に依存していない
atcは.atc.toml
で設定を行うことができます。以下は私の設定になります。
[config] runcmd = "{{ .dir }}/main" buildcmd = "g++ -o {{ .dir }}/main {{ .file }} -I/home/duglaser/src/github.com/DuGlaser/atcoder-answer/ac-library/" filename = "main.cpp" lang = "4003" template = """ #include <atcoder/all> #include <bits/stdc++.h> using namespace std; using namespace atcoder; template <class T> using vc = vector<T>; template <class T> using vvc = vc<vc<T>>; using ll = long long; ll MOD = 998244353; ll MAX_LL = numeric_limits<ll>::max(); ll MAX_INT = numeric_limits<int>::max(); #define rep(i, n) for (ll i = 0; i < n; i++) #define per(i, n) for (ll i = n - 1; i >= 0; i--) #define Rep(i, sta, n) for (ll i = sta; i < n; i++) #define rep1(i, n) for (ll i = 1; i <= n; i++) #define per1(i, n) for (ll i = n; i >= 1; i--) #define Rep1(i, sta, n) for (ll i = sta; i <= n; i++) #define all(v) (v).begin(), (v).end() int main() { } """
このようにruncmd
やbuildcmd
などを設定できるようにしているため様々な言語で使うことができます。詳しくはREADMEをご覧ください。
さいごに
割とノリと勢いで作った割には便利で周りの友人も使ってくれていたりして結構嬉しい。
みなさんもよろしければ是非使ってみてください!