はむ吉(のんびり)の練習ノート

主に(競技)プログラミングや言葉について,思いついたことや,試してみたこと,学んだことを,覚え書きを兼ねてまとめます.その際に参考になった,書籍などの紹介も行います.

Windows 10 上で atcoder-cli を online-judge-tools と連携させて使う:導入からテストと提出までの基本的操作

online-judge-tools は,オンラインジャッジを利用し,競技プログラミングの問題を解く際に行う作業を支援します.また,atcoder-cliは,これと連携し,AtCoder における一連の作業をさらに省力化します.本記事では,これらの強力なツールを Windows 10 環境に導入し,コーディング,テスト,提出などの基本的操作を行うまでについてまとめます.使用言語は Python ですが,これ以外の言語でも応用可能です.

注意

本記事で扱う online-judge-tools および atcoder-cli は,サードパーティ(有志の方々)によるものです.今後,もし AtCoder の仕様または規約等が変更された場合,以下の記述のようには利用できなくなるおそれがあります.

はじめに

競技プログラミングの問題に取り組む際には,ただ解答のコードを書くだけではなく,与えられた,あるいは自作した入出力例を用いたテストを行ったり,所定の方法でコードをオンラインジャッジに提出したりする必要があります.通常は,これらはコマンドラインだけでは完結せず,ブラウザを利用して,手動でコピー・アンド・ペーストなどの操作を行わねばならず,時として煩雑です.そこで,online-judge-tools および atcoder-cli というツールが,有志の方々により開発されました.online-judge-tools は,Codeforces, AtCoder および HackerRank などのオンラインジャッジに対応し,テストケースの取得と生成や,コードのテストと提出などをコマンドラインで可能にするツールです.また,atcoder-cli は,online-judge-tools と連携しつつ,AtCoder に特化して,取得したコンテスト情報に応じたプロジェクトの作成を含む,様々な操作を可能にするコマンドラインツールです.本記事では,atcoder-cli に力点を置き,online-judge-tools との連携機能も必要に応じて使用しつつ,テストや提出などの基本的操作を行う方法について述べます.

なお,両ツールについては,作成者の方々による online-judge-tools ドキュメント および atcoder-cli 解説記事 に加えて,以下のような記事も存在します.本記事の作成にあたっても,参考にしました.ただ,私の環境ではやや違った,あるいは追加の操作を行う必要があったため,備忘録を兼ねて本記事にまとめます.

主な前提条件

  • OS: Windows 10(バージョン 1909 で動作を確認)
  • パッケージ管理ツール Chocolatey が導入されている
  • 問題を解くのに利用する言語の処理系とエディタが導入されている
  • 簡単のため,各種ツールは,ユーザごとではなくグローバルに導入するものとする
  • Windows Subsystem for LinuxCygwin などは使わず,Windows 環境に直接諸ツールを導入する

ツールの導入と初期設定

ツールおよびその動作に必要な処理系とライブラリの導入

online-judge-tools の導入と動作には,Python 3 処理系(およびこれに付属するパッケージ管理ツール pip)が必要です.また,atcoder-cli には,Node.js が必要です.Chocolatey が導入されている場合,これらは以下のコマンドを管理者権限で実行することで導入されます.シェル(コマンドプロンプトあるいは PowerShell)の再起動(もしくは環境変数の再読み込み)が要求されたら,従ってください.

cinst -y python nodejs

次に,online-judge-tools と atcoder-cli を導入します.まず,管理者権限で以下のコマンドを実行することで行います.

pip3 install online-judge-tools
npm install -g atcoder-cli

ツールが正常に導入されたことを確認するには,oj -h および acc -h を実行するとよいでしょう.なお,私の環境では,後者を PowerShell で実行しようとすると,「このシステムではスクリプトの実行が無効になっているため......」というエラーメッセージが代わりに表示されることがありました.もし,一般ユーザ権限で PowerShell を起動しており,現在利用中のユーザだけで実行できるようにするには,Set-ExecutionPolicy -Scope CurrentUser RemoteSigned などをあらかじめ実行し,ポリシーを変更しておきます.これを既定とするには,管理者権限で Set-ExecutionPolicy RemoteSigned などとします.なお,ポリシーの変更にあたっては,セキュリティ上の問題が生じることがあるので,注意してください.Set-ExecutionPolicy およびこれに与える引数の説明は,about_Execution_Policies - PowerShell | Microsoft Docs などで見つかります.

AtCoder へのログイン

これ以降の操作は,管理者権限ではなく一般ユーザ権限で行います.

AtCoder の提出機能を利用するには,online-judge-tools および atcoder-cliAtCoder にログインする必要があります.online-judge-tools に関しては,以下のコマンドを実行します.“Selenium fails” と表示されます*1が,CUI を用いたログインが可能になります.AtCoder のユーザ ID とパスワードを入力してください.

oj login https://atcoder.jp

また,atcoder-cli についても,同様にログインを行う必要があります.以下のコマンドを実行し,CUI の指示に従ってログインしてください.

acc login

atcoder-cli の初期設定

個人の好みにもよりますが,可能な限りの省力化や,online-judge-tools との連携を考慮して,以下の設定を行うことをおすすめします.

全問題に対するディレクトリを既定で作成する

後述するように,atcoder-cli では,acc new でコンテストごとのディレクトリを作り,その中に acc add で問題ごとのディレクトリを作ることになります.既定では,問題ごとのディレクトリを作成するにあたり,毎回問題を選択する必要がありますが,あらかじめすべての問題ディレクトリを作成するように設定することができます.そのためには,以下のコマンドを実行します.

acc config default-task-choice all
入出力例のディレクトリの設定を online-judge-tools の設定と合わせる

既定では,atcoder-cli は入出力例(サンプル)などのテストケースを,問題ディレクトリ配下の tests ディレクトリに配置しますが,これは online-judge-tools の既定である test (s の有無に注意してください)とは異なります.そこで,atcoder-cli の既定の設定を,以下のように変更します.

acc config default-test-dirname-format test
テンプレートの設定

問題ごとに,まっさらからコードを書くのではなく,最低限のひな型からコードを作成するように設定すると便利です.atcoder-cli には,これを可能にするテンプレート機能があります.ここでは,Python 3 のテンプレートを作る場合を例として,手順を詳述します.

まずは,テンプレートなどの設定ファイルを格納するディレクトリを知るために,以下のコマンドを実行します.既定では,Config で終わるパスが表示されるはずです.

acc config-dir

このパスに移動し,作りたいテンプレートの名前をもつディレクトリを作成します.ここでは,python とします.この中に,テンプレート本体である main.py と,その設定を記す template.json を以下のように作成します.

まず,main.py の例を示します.ここでは空っぽの main 関数のみを定義しましたが,必要ならば記述を追加してもかまいません.なお,1 行目の shebang が必要であることに注意してください.これは,AtCoder の提出言語を Python 3 に設定するためのものです.

#!/usr/bin/env python3


def main():
    pass


if __name__ == '__main__':
    main()

次に,template.json を例示します.各問題ごとに main.py の複製を作成し,これを提出にも用いるという趣旨です.

{
    "task":{
      "program": ["main.py"],
      "submit": "main.py"
    }
}

atcoder-cli を用いてコンテストの問題に取り組む

上記の設定により,atcoder-cli を使って AtCoder のコンテストの問題に関する基本的操作を行うための準備が整ったはずです.ここでは,practice contest のプロジェクトの作成から,A 問題 への解答提出までを例として取り上げます.

コンテストのプロジェクトの作成

適当なディレクトリ内で,以下のようにコンテストのプロジェクトを作成します.ここで,上記コンテストの URIhttps://atcoder.jp/contests/practice なので,その末尾である practice をコンテスト ID として指定しています.また,上記のテンプレートを利用すべく,python を指定しています.この操作により,practice プロジェクト(ディレクトリ)が作成されます.なお,B 問題の性質(リアクティブ問題)上,テストケースが存在しないというエラーが表示されますが,以下の操作には差し支えません.

acc new practice --template python

コーディングと入出力例によるテスト

ここでは A 問題を解くので,practice/a ディレクトリに移動します.先ほど作った main.py と,入出力例を格納した test ディレクトリが見て取れます.まずは,main.py を編集し,問題に答えるコードを作成します.たとえば,以下のようになるでしょう.

#!/usr/bin/env python3


def main():
    a = int(input())
    b, c = (int(z) for z in input().split())
    s = input()
    print(a + b + c, s)


if __name__ == '__main__':
    main()

これが適切なコードであるか確かめるために,online-judge-helper を利用し,入出力例でテストを行います.そのためには,以下を実行します.ここで,-c の引数には,先ほど作ったプログラムを実行するために必要なコマンド(とその引数)を指定します.実行後,入出力例を用いたテストが行われ,実行時間や判定(AC や WA など)が表示されます.

oj t -c "python main.py"

コードの提出

コードの正当性を確認したら,提出に移ります.そのためには,以下のコマンドを実行します.続行するには(問題の ID から得た)特定の文字列を入力するように求められる*2ため,これを入力します.すると,自動的にブラウザが起動し,提出結果が表示されます.

acc submit

おわりに

atcoder-cli と online-judge-tools の導入方法と基本的な使い方をまとめました.今までは長らく手動でこれらの操作を行い,間違えてシェルがぐちゃぐちゃになることもしばしばあったのですが,ずいぶんと楽になりそうです.両ツールには便利な機能がほかにも多くあるようなので,おいおい学んでいきたいと思います.

*1:今回の手順では Selenium の導入を省略しています.

*2:私の環境では,この直前に “no samples were downloaded” という警告が表示されますが,これを解消する方法はいまのところわかっていません.