Help us understand the problem. What is going on with this article?

Emacsで競プロしませんか? ~Emacsでonline-judge-toolsを使おう~

注意

現状、残念ながらAtcoderにしか対応できていません。拡張できるように作ってはいるので、今後追加しようと思っています。

導入

みなさん、Emacsはお好きですか?なんでもEmacsでやりたくなるお年頃ですよね?

私もその一人です。ここ最近Atcoderにちょくちょく参加しているのですが、Emacsで書いていると、コードをコピーして提出するのが地味に面倒臭いです。

そこでまず初めに登場するのが online-judge-tools(以下oj)です。詳細は以下にあります。

ソース, 本体: https://github.com/kmyk/online-judge-tools
ドキュメント: https://online-judge-tools.readthedocs.io/en/master/introduction.ja.html

このツールは、オンラインでの競技プログラミングにおいて必要な提出、テストなどの雑多な操作をコマンドラインで行えるようにするものです。

そして、今回ご紹介する拙作は、このツールのEmacsクライアントです!

https://github.com/ROCKTAKEY/emacs-online-judge

packageの名前はなんの捻りもなくonline-judgeです。これを使えば、Emacsの関数ひとつで提出やテストが行なえるようになります!

ご使用の前に

現状、dashfに依存していますので、それらと、先程のemacs-online-judgeをダウンロードしてload-pathに通してください。

次に、ojにパスを通すか、online-judge-executableに場所を格納してください。

(require 'online-judge)
(setq online-judge-executable "/path/to/oj")

最後に、M-x online-judge-loginをして、Atcoderを選択し(現状これ以外に選択枝はありません)、Atcoder のユーザー名とパスワードを入力してください。oj loginに渡されます。これは、解答を提出する際に必要なものです。なお、Emacs側ではこれらの情報は一切保存しないので御安心ください。

基本的に前もって必要な設定はこれだけです。あとは、適当なファイルを開いて、M-x online-judge-modeすると、サービス名及びコンテスト名、問題番号を聞いてきますので、順次入力していけば、設定は完了します。

ちなみに、パス名を次のような感じにすると、よしなにサービス・コンテスト名や問題番号を検出してくれます。ここは結構がんばりました。
- atcoder/abc130/a.cpp
- atcoder/abc130/b2.cpp
なお、ABCとAGC以外のコンテストは検出できませんので、悪しからず。

それと、次のように、online-judge-directoriesにディレクトリのリストを指定しておくと、そのディレクトリ内のファイルを開いたときに自動でonline-judge-modeが立ち上がるようになります。

(setq online-judge-directories '("~/atcoder/"
                                 "/my/awesome/dir/"))

使い方

ファイルを開く。

online-judge-modeになっていれば、モードラインに現在解いている問題の情報が表示されます。

問題を解く。

コンパイルする。

online-judge-command-nameがデフォルトのままなら、a.exeもしくはa.outにコンパイルしてください。online-judge-command-namenilにしておくと、拡張子なしファイル名.exeが実行ファイルになります。お好みでどうぞ。

申し訳ないのですが、インタプリタ型言語には今のところまともに対応できておりません。online-judge-command-nameという変数をevalすることで実行ファイル名を得ているので、自前でS式を用意していただけると幸いです。

M-x online-judge-run-testでsample caseをtestする。

ただし、初回はサンプルのダウンロードがあるのでやや遅いです。
また、非同期での実行になりますので、テストが終わって初めてテスト結果が表示される形になります。この画面が今のところかなり見づらいです。今後改善したいと思います。

2020-02-03 追記: テスト結果の表示にoutline-minor-mode及びfont-lockを導入しました。比較的重要でない出力にはコード内コメントのfaceが適用されます。また、現在の実行結果以外は折り畳まれるようになりました。これで、だいぶ見やすくなった思います。

M-x online-judge-submitで提出!

提出が成功すると、"Submission succeeded."とエコーエリアに表示されます。

誤差

  • online-judge-toggle-error-range: 誤差許容範囲を0とonline-judge-error-range-defaultでtoggle
  • online-judge-update-error-range: 誤差許容範囲の変更。 これらは、答えとの誤差の許容範囲を設定するものです。デフォルトは許容誤差は0(つまり誤差を許容しない)になっています。問題によって異なるので、各自で設定してください。

今後の展望

  • test結果の見た目をきれいにする。 DONE: 2020-02-03
  • Codeforce, Topcoderなどに対応する。
  • インタプリタ型の実行をサポートする。
  • melpaへの投稿。

最後に

当packageが依存しまくっているojの作者のKimiyuki Onakaさんに多大なる感謝の意を表します!
また、まだまだ発展途上なpackageですので、issue、pull-requestともどもお待ちしています!Starも大歓迎です!それではよいEmacs Lifeを!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away