EmacsでAtCoderのコンテストに出るための環境を整えました。今回は言語としてPythonを使う場合を想定しています。
全体の方針
ベースとして oj というツールを使います。これでCLIからいろいろと操作が可能なのですが、さらにこれをEmacsから使うために oj.el というラッパーライブラリを利用します。
oj.elについては作者の方がQiitaで解説してくださっています。
基本はこちらをご覧いただければいいのですが、今回は AtCoder + Python という環境にフォーカスした具体的な設定内容をご紹介します。
インストール
まずは依存パッケージをインストールします。
pip3 install online-judge-tools
pip3 install online-judge-template-generator
pip3 install selenium
余談ですが、pipでのコマンドのインストールはよく考えずに実施するとトラブルの元です。というのもPythonの仮想環境を構築していたりpyenvを使っていたりするとpipをどの環境で実行したかによってインストール先が異なってしまうためです。pipでグローバルに使うようなコマンドを入れる場合は pipx をおすすめします。
次にEmacsでoj.elを利用するように設定を追加します。
(use-package oj
:ensure t
:custom ((oj-compiler-python "cpython")
(oj-default-online-judge 'atcoder)
(oj-submit-args '("-y" "-l" "5055"))
(oj-home-dir "/path/to/oj-home/")))
これでほぼ設定は完了です。ここで (oj-submit-args '("-y" "-l" "5055"))
は提出言語として Python (CPython 3.11.4) を使うという指定です。ojは自動で提出言語を推測してくれるのですが、一意に特定できない場合に以下のようなエラーが出ます。
[ERROR] Matched languages were not narrowed down to one.
[INFO] You have to choose:
5055 (Python (CPython 3.11.4))
5063 (Python (Mambaforge / CPython 3.10.10))
5082 (Python (Cython 0.29.34))
一番左の4桁の数字がIDなので、これを oj submit
の -l
オプションの引数として渡せば大丈夫です。
ログイン(oj-login
)
まずはAtCoderにログインします。これは M-x oj-login
で可能です。ミニバッファに Login for:
と出るので atcoder
を選択しましょう。あとはツールの指示に従ってブラウザでログインすればOKです。
ちなみに私は一度ログインしてもoj側で認識されなかったのですが、再度実施したら通りました。そういうこともあるでしょう。
コンテストの準備(oj-prepare
)
コンテストが開始されたら M-x oj-prepare
で準備をします。例えば ABC360 に参加する場合は oj-prepare
を実行した上で abc360
を入力します。すると以下のようなディレクトリ構造ができあがります。あとは main.py
を編集すればOKです。もちろん、参加登録が必要な場合は先に済ませておきましょう。
.
├── abc360_a
│ ├── generate.py
│ ├── main.cpp
│ ├── main.py
│ └── test
│ ├── sample-1.in
│ ├── sample-1.out
│ ├── sample-2.in
│ └── sample-2.out
├── abc360_b
│ └── (略)
├── abc360_c
│ └── (略)
├── abc360_d
│ └── (略)
├── abc360_e
└── (略)
├── abc360_f
│ └── (略)
└── abc360_g
└── (略)
ちなみに main.py
の中身は以下のように問題に合わせて自動生成されます。これは template-generator の力です。まれに自動生成に失敗しますが、そうするとコード内にTODOと書かれるので気づくことができるかと思います。
#!/usr/bin/env python3
# from typing import *
YES = 'Yes'
NO = 'No'
# def solve(S: str) -> str:
def solve(S):
pass # TODO: edit here
# generated by oj-template v4.8.1 (https://github.com/online-judge-tools/template-generator)
def main():
S = input()
a = solve(S)
print(a)
if __name__ == '__main__':
main()
テスト(oj-test
)
コードが書けたらローカルでテストをしましょう。テストは M-x oj-test
で実施できます。コマンドを実行するとバッファが開いてテスト結果が表示されます。デフォルトで実行されるのはコンテストの問題ページにあるサンプルの入出力です。
提出
テストも通ったら M-x oj-submit
で提出します。提出が完了するとブラウザで提出結果が自動で開きますので、そこで結果を確認しましょう。
次の問題へ進む(oj-next
)
次の問題に進む場合は M-x oj-next
を実行します。自動で次の問題の main.py
を開いてくれます。逆に戻る場合は M-x oj-prev
を使います。
さいごに
EmacsでAtCoderに効率的に参加できるoj.elを紹介し、Pythonで参加するための最低限の設定内容も記載しました。Atcoderやoj、oj.elなどの仕様変更によって記載内容が古いものとなる可能性があります。もしこれで不備がある場合はお問い合わせからご連絡いただけると幸いです。