@nodchip さんのスクリプトが素晴らしい、気がする
いろいろ探してみたところ良い感じのものが見つかりました。
それが @nodchip さん作で、以下の記事から取得できるスクリプト。
- オンラインジャッジ補助スクリプト - nodchipの日記
PKUとCodeforces用の補助スクリプトを過去に公開したのだが、
一つのスクリプトで両方に対応したいと考えて統合してみた。
さらに、M-JudgeとAOJにも対応してみた。
@nodchip さんのスクリプトは、とっても便利な気がするので実際に動作確認をしてみることにしました。
@nodchip さんのスクリプトって、どんな感じなの?
このスクリプトは、以下の5つのオンラインジャッジに対応していているそうだ。
機能としては、
- サンプル入出力のダウンロード&テスト実行
- テンプレートファイルのコピー
- ソースコードのサブミット
ができるらしいです。なるほど。。
これは、神のようなスクリプトじゃありませんか。
スクリプトを貼ってある記事には、他に細かいことが書いていないです。
なので詳しくはコードを読むか、実行してみてUsage を見るしか無さそう。
コードの動作を確認してみた
スクリプトに「ojck.py」と名付けて保存したのですが、
実行した結果、そのままでは動作しませんでした。
僕の MacBook に入っていた Python は 2.5系だったので、json が無かったです。
2.6 系は標準で JSON 対応をしてるみたいなのですが 2.5 系は違うみたい。
2.6系の Python をインストール & コード書き換え
2.5 系でも使えるJSONモジュールに「simplejson」というのがあるそうなので、それを使うことで 2.5系でもいけるかなと思いましたが、他にもエラーが出てきます。
そのエラーについては、多くのコミュニティで「それが出るなら、もう2.6にすればいいじゃん」と結論を出しているエラーなので、僕も2.6系をインストールすることにしました。
以下のコマンドを入力したら Python 2.6 が入りました。
sudo port selfupdate sudo port install python26 sudo python_select python26
Mac Ports でインストールした python は、「/opt/local/bin/python」に入っています。
確認すると以下のとおり。
リアルタイム超音波と血栓症とは何か
$/opt/local/bin/python --version Python 2.6.6
実行する python 2.6.6 の位置を指定するため、スクリプトの1行目のpython のパスを「/opt/local/bin/python」に書き換えてます。
こうすることで僕の手元の python 2.6 でも一応、動くようになりました。
とりあえず Usage 表示
このスクリプトは特に何もオプションを指定しなければ Usage を表示するようになっているみたいなので、実行してみます。
すると、以下のようにエラーなく Usage の確認をすることができました。
$./ojck.py Select problem id. Usage: ojck.py [options] Options: -h, --help show this help message and exit -c, --create-solution-template-file Build and check the solution -s, --submit Submit the solution -a, --add-test-case-template Add a test case template file -i SOURCE_FILE_NAME, --source-file-name=SOURCE_FILE_NAME Specify the source file name --poj PKU JudgeOnline --codeforces CodeForces --mjudge M-Judge --aoj Aizu Online Judge --codechef CodeChef -t, --titech-pubnet Use titech pubnet proxy -e FLOATING_POINT Use floating point validator and set max error
良い感じっぽいですね。
setting.json を用意する
じつは�br /> このファイルを用意しないで submit しようとするとエラーがでます。
$ojck.py -s 任意の問題番号 Traceback (most recent call last): File "../ojck.py", line 510, inmain() File "../ojck.py", line 503, in main online_judge.submit() File "../ojck.py", line 274, in submit setting = json.load(open('setting.json'))['poj'] IOError: [Errno 2] No such file or directory: 'setting.json'
コードを読んでみると、各オンラインジャッジサービスのディレクトリごとに setting.json を用意して、そこにユーザ名とパスワードと開きたいブラウザの実行パスをJSONのハッシュで保存すれば良いみたいです。
Mac OS Xの場合はコマンドラインからURLを開くときには「openコマンド」を使うので、browserには「open」を指定してあげれば良いです。
そうすれば、規定のブラウザでウィンドウが開きます。
setting.json のひな形は以下のとおり。
オンラインジャッジ名はpojとかcodeforcesとかUsageに従いましょう。
- 僕用の setting.json のひな形
アレルギー症状をcaues何
{"オンラインジャッジ名":{"user_id":"overlast","password":"任意", "browser":"open"}}
これを元に作った setting.json を各オンラインジャッジのディレクトリごとに配置しました。
いろいろ動作を見てみる
とりあえず テスト してみましょう。
実は PKU は一問だけ解いていたので、そのコードを使います。
- [O] PKU JudgeOnline - ID:1000
#includeint main() { int a,b; scanf("%d %d",&a, &b); if ((a >= 0) && (10 >= a) && (b >= 0) && (10 >= b)) { printf("%d\n", a + b); } return 0; }
このファイルを「問題番号.cpp」というファイルで保存します。
ということは、取り組むオンラインジャッジごとにディレクトリを分ければ良いことが分かります。
いざ実行。
テストの実行は、第一引数に任意の問題番号を与えるとできます。
まだテストが作られていないときには任意のオンラインジャッジを指定することで、指定したオンラインジャッジの任意の問題番号のテストが作られます。
以下では、上記のPKUの1000番の問題のプログラムを1000.cppとして用意したうえで、「--poj」オプションでPKUを指定し、問題番号として1000を与えたときの動作です。
$cd poj $ls 1000.cpp setting.json $../ojck.py --poj 1000 compiling... downloading... Case #0: 3 3 OK (max 0.00499296188354s)
おおお。自動でテストできます。
ローカルに、1000.0.in.txt と 1000.0.out.txt ができていて、それを使ってテストしているようです。
ちなみに、先ほど生成した1000.0.in.txt と 1000.0.out.txt を消して、同様のコマンドを「--poj オプション」じゃなくて「--aoj オプション」付きで実行すると、AOJの1000番のテストができあがるので、テストに失敗します。
ちゃんと指定したオンラインジャッジのテストを作ってくれるようです。
submit してみる
では submit してみます。
サブミットするときは、
$../ojck.py --poj -s 1000 Login ... 200 Submit ... 200
と表示されて、以下のような画面が開きました。
無事にコードをSubmit できたし、submit の状況も確認できました。
調子にのって、このスクリプトをテストしていたら、同じ問題を submit しすぎて点数が下がりまくり大変に焦った。
swallowenリップを離れて取得する方法
テンプレートは使えるの?
事前に用意したテンプレートのコピーはしてくれます。
各オンラインジャッジのディレクトリ内に「template.cpp」というファイルを用意しておいて、
-c オプションをつけて、問題番号を引数に渡せば以下のように動作します。
$ls setting.json template.cpp $ojck.py -c 任意の問題番号 I/O error(2): No such file or directory Copied template.cpp to 任意の問題番号.cpp $ls 任意の問題番号.cpp setting.json template.cpp
途中のエラーは、既存の「任意の問題番号.cpp」を「任意の問題番号.cpp.bak」にコピーしようとしたけど、そのcppファイルがないからエラーがでたのです。気にする必要はないです。
今後は template.cpp を育ててあげる必要がありますね。
最初は TopCoder に使っているやつを改造すれば良いかな。
例えばこんな感じ。
#include#include #include #include #include #include
input と output は、どうせ各問題で違うのでアバウトで大丈夫だと思ってます。
本当は問題から生成できると良いんだけど、各ジャッジで形式がちがうし、最初はこんなもんで良いのでは。
神テンプレートを作ってる人はご連絡ください。
自前でテストを追加できる?
できるようです。
以下のように -a オプションに任意の問題番号を与えると、テストファイルが作成されます。
テストファイルは「 任意の問題番号.テスト番号.in.txt」と「 任意の問題番号.テスト番号.out.txt」が作られます。
$ojck.py -a 任意の問題番号 Test case template file 0 is created. $ojck.py -a 任意の問題番号 Test case template file 1 is created. $ojck.py -a 任意の問題番号 Test case template file 2 is created.
まだ存在しないテスト番号のうち、もっとも小さいテスト番号でテストを作成するので、0, 1, 2と作ったあと 1を消して、再度テストを作ると 1, 3, 4... と作られます。0, 2 は既にあったテストのままです。
おわりに
今回は @nodchip さんのオンラインジャッジ補助スクリプトを使って、実際にPOJの問題を解いたコードをテストして、submitしてみました。
このスクリプトがあれば、TopCoder 以外のオンラインジャッジに取り組むコストが明らかに下がります。
@nodchip さんに感謝いたします。どうもありがとうございます。
関連リンク
- nodchip (nodchip) on Twitter
僕の机の上にある関連書籍
プログラミングコンテストチャレンジブック
[Amazonで詳細を見る]
# ↑自習に使ってます。
# ↑必要なとこをつまみ読みしてます。
アルゴリズムクイックリファレンス
[Amazonで詳細を見る]
# ↑これも分からないときにチラ見。
# ↑この本は再度取り組み始めたところです。
0 件のコメント:
コメントを投稿