atcoder-cli、online-judge-toolsをjavaで環境構築する
はじめに
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は使いやすいように適当に作成します。
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