🕌

atcoder-cli、online-judge-toolsをjavaで環境構築する

2023/03/24に公開

はじめに

atcoderを始めるにあたり、atcoder-cli、online-judge-toolsを導入して効率化を図りました。
OSはWindows、言語はjava、テキストエディタはVSCODEを使用しています。

環境

OS:Windows 21H1
java:8.0 → 11.0.16.1 (導入の途中でバージョンを上げています)
VSCODE:1.71.2

導入手順

atcoder-cliの開発者さんのweb記事を参考に導入していきます。

Python3とNode.jsの導入

Python

公式からインストールします
インストーラーをダウンロードし立ち上げると'Add Python 3.x to PATH'という項目があるので忘れずにチェックします。

インストールの確認

$ pip3 -V
pip 22.2.2 from C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\pip (python 3.10)

Node

公式からインストールします。
LTSのWindows版を選択します。

インストールの確認

$ npm -v
8.15.0

atcoder-cli、online-judge-toolsのインストール

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

インストールの確認

atcoder-cli

$ acc -h
helpが出たらOK

online-judge-tools

$ acc check-oj
online-judge-tools is available. found at:
C:\Users\user\AppData\Local\Programs\Python\Python310\Scripts\oj.exe

AtCoderとonline-judge-toolsへログイン

AtCoder

atcoder公式のユーザネームとパスワードを入力します。

$ acc login
? username: xxxx
? password: [hidden]
OK

online-judge-tools

$ oj login https://beta.atcoder.jp/
[INFO] GET: https://pypi.org/pypi/online-judge-tools/json
[INFO] 200 OK
[INFO] GET: https://pypi.org/pypi/online-judge-api-client/json
[INFO] 200 OK
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] load cookie from: C:\Users\user1\AppData\Local\online-judge-tools\online-judge-tools\cookie.jar
[NETWORK] GET: https://atcoder.jp/contests/agc001/submit
[NETWORK] 200 OK
[SUCCESS] You have already signed in.
[INFO] save cookie to: C:\Users\user1\AppData\Local\online-judge-tools\online-judge-tools\cookie.jar

問題のディレクトリを作成

ツールがインストールできたら対象の問題用にディレクトリを作成していきます。
その前に、atcoder-cliのデフォルト動作の設定を行います。

デフォルト設定

全ての問題のディレクトリを作成する

ディレクトリを作成する際、acc new 問題ID を入力することでディレクトリを作成できますが、
解きたい問題を毎回選択しなければなりません。
デフォルトで全ての問題を作成した方が便利なのでその設定を行います。

acc config で設定を確認します。

$ acc config
oj-path: C:\Users\user1\AppData\Local\Programs\Python\Python310\Scripts\oj.exe
default-contest-dirname-format: {ContestID}
default-task-dirname-format: {tasklabel}
default-test-dirname-format: test
default-task-choice: all
default-template: java

下記のコマンドで全ての問題でディレクトリが作成されるようになります。

$ acc config default-task-choice all

入出力例のディレクトリ名をonline-judge-toolsに合わせる

atcoder-cliは入出力例のテストケースをtestsディレクトリに配置しますが、online-judge-toolsの既定であるtestと異なるため、
atcoder-cliの規定の名前をtestに変更します。

$ acc config default-test-dirname-format test

テンプレートの設定

問題を解く用のファイルをテンプレートとして登録しておくと便利です。acc new した際に問題ごとにテンプレートファイルも一緒に作成してくれます。

テンプレートなどの設定ファイルの格納場所を知るために下記のコマンドを使用します。

$ acc config-dir
C:\Users\user1\AppData\Roaming\atcoder-cli-nodejs\Config

Configの中にjavaという名前でディレクトリを作成します。
このjavaの中にテンプレートであるMain.javaと設定ファイルのtemplate.jsonを作成します。

Main.javaは使いやすいように適当に作成します。

Main.java
import java.util.Scanner;

public class Main {
    public static void main(String [] args) {
        try(Scanner scan = new Scanner(System.in)){
          System.out.println();
        }
    }
}

programに書いたほうが自動生成されるファイルで、submitは提出するファイル。

{
    "task":{
      "program": ["Main.java"],
      "submit": "Main.java"
    }
}

下記コマンドでテンプレートとして設定します。作成したディレクトリ名を指定します。

$ acc config default-template java

ディレクトリ作成

acc new コマンドで問題のディレクトリを作成します。
abc101でやってみます。

$ acc new abc101

ディレクトリ構造

ATCODER
|--abc101
| | --a
| | | --test
| | | | --sample-1.in
| | | | --sample-1.out
| | | | --sample-2.in
| | | | --sample-2.out
| | | | --sample-3.in
| | | | --sample-3.out
| | | -- Main.java
. |--b
. 以下dまで繰り返す
.
| contest.acc.json

問題の提出

テスト

下記コマンドでサンプルテストケースを使ったテストを実施します

$ oj t -c "java Main.java" -d ./test/
メイン・クラス *** が見つからなかったかロードできませんでした

エラーが出てしまいました。
javaのバージョンが8だったため、javaコマンドで実行する際に-cp でクラスパスを指定する必要があったようです。

$ oj t -c "java -cp C:\Users\user1\AppData\Roaming\Code\User\workspaceStorage\1717bcaafdefbf66eb551b04593494f9\redhat.java\jdt_ws\atcoder_7299def0\bin abc101.a.Main" -d ./test/

これでテストは実行できましたが、この記事に書いてあるようにjava11だとjavaコマンドのみで単一の Java プログラムを実行できるようです。このタイミングでバージョンを11にあげました。
もう一度実行します。

$ oj t -c "java Main.java" -d ./test/  
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] 3 cases found
[WARNING] GNU time is not available: time

[INFO] sample-1
[INFO] time: 0.918976 sec
[SUCCESS] AC

[INFO] sample-2
[INFO] time: 0.745051 sec
[SUCCESS] AC

[INFO] sample-3
[INFO] time: 0.745566 sec
[SUCCESS] AC

[INFO] slowest: 0.918976 sec  (for sample-1)
[SUCCESS] test success: 3 cases

無事テストが実行されました。

問題を提出

下記コマンドで問題を提出します。

$ acc submit Main.java
省略
[ERROR] Matched languages were not narrowed down to one.
[INFO] You have to choose:
4005 (Java (OpenJDK 11.0.6))
4029 (Haxe (4.0.3); Java)
4030 (JavaScript (Node.js 12.16.1))
4052 (Java (OpenJDK 1.8.0))

エラーが出ました。実行環境が複数あるので指定しないといけないようです。java11で提出したいので4005を選びます。
コマンドを下記に変えます。--から右側はonline-judge-toolsのコマンドです。

$ acc submit Main.java -- -l 4005
error: unknown option '-l'

またエラーになりました。VSCODEのターミナルの規定がpowershellになっていたのが原因だったので、コマンドプロンプトに変更して再度実行します。

$ acc submit Main.java -- -l 4005
submit to: https://atcoder.jp/contests/abc101/tasks/abc101_a
[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1)
[INFO] code (462 byte):
import_java.util.Scanner;\r
\r
public_class_Main_{\r
____public_static_void_main(String_[]_args)_{\r
______final_String_plus_=_"+";\r
______try(Scanner_scan_=_new_Scanner(System.in)){\r
________int_total_=_0;\r
________\r(trailing whitespace)
________String_line_=_scan.nextLine();\r
________String[]_marks_=_line.split("");\r
________for(String_mark_:_marks){\r
__________total_=_total_+_(mark.equals(plus)__?_1_:_-1);\r
________}_________\r(trailing whitespace)
________System.out.println(total);\r
______}\r
____}\r
}(no trailing newline)
[INFO] load cookie from: C:\Users\user1\AppData\Local\online-judge-tools\online-judge-tools\cookie.jar
[NETWORK] GET: https://atcoder.jp/contests/agc001/submit
[NETWORK] 200 OK
[INFO] You are logged in.
[NETWORK] GET: https://atcoder.jp/contests/abc101/tasks/abc101_a
[NETWORK] 200 OK
[INFO] chosen language: 4005 (Java (OpenJDK 11.0.6))
[WARNING] the problem "https://atcoder.jp/contests/abc101/tasks/abc101_a" is specified to submit, but no samples were downloaded in this directory. this may be mis-operation
Are you sure? Please type "abca" abca
[NETWORK] GET: https://atcoder.jp/contests/abc101/tasks/abc101_a
[NETWORK] 200 OK
[NETWORK] GET: https://atcoder.jp/contests/abc101/submit
[NETWORK] 200 OK
[NETWORK] POST: https://atcoder.jp/contests/abc101/submit
[NETWORK] redirected to: https://atcoder.jp/contests/abc101/submissions/me
[NETWORK] 200 OK
[SUCCESS] result: https://atcoder.jp/contests/abc101/submissions/35454666
[INFO] open the submission page with browser: <webbrowser.WindowsDefault object at 0x000002A16965D480>
[INFO] save cookie to: C:\Users\user1\AppData\Local\online-judge-tools\online-judge-tools\cookie.jar

提出に成功するとブラウザが立ち上がり、atcoder公式サイトの該当問題ページに飛びます。

参考

atcoder初心者こそ環境構築しよう!
AtCoder を C# で戦う環境を整える
Windows 10 上で atcoder-cli を online-judge-tools と連携させて使う:導入からテストと提出までの基本的操作

Discussion