2012年4月11日水曜日

[O] PKUやCodeforcesなど5つのオンラインジャッジ対応の神スクリプト



@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, in      main()   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

 #include  int 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  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  using namespace std; static const double EPS = 1e-5; typedef long long ll;  class Solution { public:   int solve(int a, int b) {     int result = -1;     return result;   } };                                                                                     int main() {   Solution ___solution;   int a, b, res;   while ( cin >> a >> b ) {     res = ___solution.solve(a, b);     if (res >= 0) {       cout << res << endl;     }   }   return 0; } 

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で詳細を見る]

# ↑必要なとこをつまみ読みしてます。

アルゴリズムクイックリファレンス

[Amazonで詳細を見る]

# ↑これも分からないときにチラ見。

コンピュータの数学

[Amazonで詳細を見る]

# ↑この本は再度取り組み始めたところです。



These are our most popular posts:

2281 Link and Pop -- the Block Game - PKU Wiki*

6 日前 ... あるブロックのペアが削除された後、ブロックはその移動属性の方向に移動させられる か確認するために一つずつチェックされます。一番上の ... 各テストケースの最初の行は ボードの大きさを表す2つの整数n, m (1 = n, m = 30)を含みます。 read more

出生前診断・選択的中絶について・外国

1963 マサチューセッツ州で新生児に対して強制的にPKUのテストを行うこ とを明記 した最初の法律成立(この州ではこれに ... 1970-73 13の州が鎌型血球病の保因者を 検査するための法律を制定 これらの多 くは,出生時,学校入学時又は結婚許可証の 申請 ... read more

FAQ - PKU Wiki*

2011年2月15日 ... 次に、解答プログラムをコンパイルするために、指定されたコンパイラが起動されます。 もしコンパイルが成功したら、ジャッジシステムは用意されたそれぞれのテストケース について解答プログラムを実行します。このジャッジシステムは「先行 ... read more

[O] PKUやCodeforcesなど5つのオンラインジャッジ対応の神スクリプト

2011年2月12日 ... 最近参加してる TopCoder の SRM のテンプレート作成プラグインが、問題中の関数 定義とテスト入出力定義から自動的に ... 実行する python 2.6.6 の位置を指定するため 、スクリプトの1行目のpython のパスを「/opt/local/bin/python」に ... read more

0 件のコメント:

コメントを投稿