永遠にWIP

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をご覧ください。

さいごに

割とノリと勢いで作った割には便利で周りの友人も使ってくれていたりして結構嬉しい。
みなさんもよろしければ是非使ってみてください!

© 2020 DuGlaser