#注意
現状、残念ながら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クライアントです!
packageの名前はなんの捻りもなくonline-judge
です。これを使えば、Emacsの関数ひとつで提出やテストが行なえるようになります!
#ご使用の前に
現状、dash
とf
に依存していますので、それらと、先程の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-name
をnil
にしておくと、拡張子なしファイル名.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を!