AtCoderでテストを簡単に行うツールを作成した

少し前から競技プログラミングに興味を持ち、AtCoderの過去問を解いている。
AtCoderの過去問は以下のサイトにまとめられている。
AtCoder Problems

解答プログラムのテストについて

解答プログラムができたらテストを行いたいと考える。
AtCoderのサイトでは、各問題に対して入力値と出力値のサンプルが提供されている。
テストを行いたい場合は、この入力値を作成した解答プログラムに与え、
プログラムの出力値とサイトに書いてある出力値と比較することで作成した解答プログラムの正しさを確認できる。
しかしながら、このテストを行う流れが割と面倒くさいという問題がある。
普段、自分はプログラムをターミナルエミュレータの上で書いて、更にその上でコンパイル、テスト実行を行っているのだが、
このやり方ではブラウザとターミナルエミュレータをいちいち切り替える必要があり手間が掛かる。
できれば全てをターミナルエミュレータ上で行いたい。
というわけでテストをコマンド1つで行えるツールを自作した。
似たようなツールはいくつか存在しているのだが、
個人的にあまり馴染めなかったため車輪の再発明を行ってしまった。

Atarg

ツールはAtargと名付けた。特に意味はない。
github.com

Pythonモジュールとして提供しているため、以下のコマンドで簡単に導入できる。

pip3 install atarg

使い方は簡単で以下通り。

usage: atarg [-h]
             {ABC,ARC,AGC} contest_no {A,B,C,D}
             command [command ...]]

具体例を挙げる。
Beginner Contestの018の問題Aをテストしたい場合はこうだ。

atarg ABC 018 A ./A

ここではカレントディレクトリにある実行ファイルAが解答プログラムとしている。
このコマンドを叩くと、Atargは問題の掲載されているWebページからサンプルの入力値と出力値を取ってくる。
その後、入力値を実行ファイルの標準入力へ与え、解答プログラムの出力値をWebページから取ってきた出力値と比較する。

個人的な使用法

これでもまだ問題はあって、Atargは与えるべき引数が多いため面倒くさい。
自分はAtCoderのプログラムを置くディレクトリを、例えばABC007であったら$HOME/Works/atcoder/ABC/007としている。
また解答プログラムについてはRustで作成しており、A.rsのようなファイル名を付けているため、rustcでコンパイルするとAという実行ファイルが出来上がる。
なのでatcというファイル名で以下のようなシェルスクリプトを書いて$HOME/.local/binに置いている。

gistdd42730cf48bf9be9a189eb2aa639d41
やっていることは簡単で、ディレクトリのパスにコンテスト名ABCと番号007が含まれているので、
切り出してAtargに与えている。
このスクリプトを利用することにより、Atargをそのまま使用するよりも簡潔に以下のようなコマンドでテストが行える。

atc A

これで明示的には解くべき問題(タスク)名だけを与えてやればよくなった。
これならタイプ量が減りより楽である。

課題

取り敢えずテストはできるようになったので、プログラムの提出も行えるようにしたい。
また、実行したプログラムが使用した時間とメモリ量も出力できるようにしたい。
これは作者自身のレベルが低く、まだ時間とメモリ量を意識するような問題を解いていないため後回しになる可能性がある。
更に困難な課題として、解答が複数個あるタイプの問題(例えば、ABC006のC問題など)には対応できていない。
上2つの課題がやるだけなのに対して、この問題については具体的な解決法が思いつかない。

まとめ

AtCoderでテストを簡単に行えるようにするプログラムを作成した。