Emacsで競技プログラミング | ojのラッパーパッケージを書いた話

Intro

ちょっとEmacsで競技プログラミングをしてみようかと思いました。

どうやらojoj-templateという便利なツールがあるようなので、Emacsから簡単に実行できるようoj.elというパッケージを作成しました。

oj, oj-template

ojは多数のオンラインジャッジに対応しているCLIツールです。

オンラインジャッジによって実装されている機能に制限はありますが、サンプルケースのダウンロード、テスト、提出、ランダムインプットの生成などの機能があります。

さらにoj-templateは入出力サンプルからそれっぽいcppとpythonファイルを生成してくれます。

また、 oj-prepare はコンテストURLを指定すると、そのコンテストの全ての問題について oj donwloadoj-template をしてくれます。

コンテスト中は時間との戦いなので、これらのコマンドによる時短は大きなものになると思います。

oj.el

oj.elは先般の oj, oj-template をEmacsから実行できるようにしたものです。

(leaf oj
  :ensure t
  :custom ((oj-compiler-c . "clang")
           (oj-compiler-python . "pypy")
           (oj-default-online-judge . "atcoder")))

単に関数にバインドしただけでなく、多少の改善を入れています。

例えば oj はダウンロードするためにURL全体を指定する必要がありますが、 oj-default-online-judge で設定されているオンラインジャッジを規定のものと考え、入力を省略できるようにしています。 (CLIツールとしての方針と干渉するものではなく、エディタの拡張としての求められる機能として盛りこんだものです。)

例えば atcoder デフォルトに設定されている状況で、 M-x oj-prepareabc167 を入力すると下記コマンドが実行されます。

oj-template https://atcoder.jp/contests/abc167

さらに、 abc167/a と入力すると下記コマンドが実行されます。

oj-template https://atcoder.jp/contests/abc167/tasks/abc167_a

このように推測できる部分については、より推測するように実装しています。

詳しい使い方についてはREADMEを参照して下さい。 基本的に oj-install-package, oj-prepare, oj-test, oj-submit の順にコマンドを実行すればいい感じに動くはずです。

まとめ

ojをEmacsから使いやすくするラッパーパッケージを書きました。

こういう方向のパッケージもお手軽で良いですね。