topcoderのSRMでGreedに乗り換え : 備忘録
去年の9月あたりに色々苦心しながらArenaの環境を整えて、やっと12月からSRMに参戦し始めた。
去年参加するための環境を整えようとしている段階で「今からやるならGreed
を入れたほうがいい」みたいなのが散見されたけど、あまりArenaの仕組みもよくわからなかったし、
とりあえずCodeProcessor + FileEdit + TZTester
を入れていい感じに出来るみたいなのを見よう見まねで入れて、参加できるようになったし結構いい感じだとは思っている。5回SRMに参加した今、なんとなく概要もつかめてみたのでここらでもっとよさげなGreed
に乗り換えてみようと思う。その設定の備忘録。
ダウンロード
公式ページからダウンロード。ちょっと下の方にスクロールして、Downloadsにある2.0RCというものをダウンロード。Greed-2.0-RC-7.1.0.jar
というものがダウンロードできる(この先アップデートによりファイル名が若干変わってるかもしれない)。
ダウンロードしたファイルを好きな位置に移す。(自分はtopcoderというディレクトリ内にプラグインやArenaが入っていて、そこにSRMというディレクトリを作ってその中にコードが入っているという現状)
Quick Startを見ながら設定
- Arena起動、ログイン
- タブから
Options -> Editor
- 左下の
Add
- Nameに
Greed 2.0
、EntryPointにgreed.Greed
と入力。 - ClassPathにはさっきダウンロードしたjarファイルの絶対パスを指定する。右のBrowseを押して、さっきダウンロードした
Greed-2.0-RC-7.1.0.jar
があるディレクトリまで移動し、Greed-2.0-RC-7.1.0.jar
をダブルクリックすると設定できる。 OK
を押して戻るとEditorsの欄にGreed 2.0みたいな行が追加されるので、Default
とAt Startup
の2つにチェックを入れる。- 次に、下の方にある
Configure
- ここには、問題に対して生成されるコードを保存するディレクトリの絶対パスを指定する。自分だったら、
/xxxx/yyyy/topcoder/SRM
みたいな感じ。 Verify & Save
Save
してClose
とりあえず設定完了
とりあえずこれで使えるようにはなるらしい。ということで、適当なSRMを開いてどんなもんか見てみる。
SRM576 DIV1を開き、256点の問題を開けてみると、CodingAreaを見ると何やらGreedが呼ばれたのというのが分かった。そして、指定したディレクトリ(SRM)内を見てみると、SRM 576
というディレクトリが作成されており、中には
- ArcadeManao.cpp(自分のコードをこれに記述)
- ArcadeManao.html(ブラウザで開いて問題文を見れる、白地なのとフォントのおかげでなんとなく見やすい感)
- ArcadeManao.sample(Sampleに示された入出力例がテキストファイルでまとまっている)
という3つのファイルが作成されていた。C++ファイルのBEGINCUTとENDCUTの間に何やらゴニョゴニョ書かれているから、多分手元でこのC++ファイルをコンパイルして実行すると.sampleから読み込んで自動テストするんだろうな〜みたいな感じに見えた。 これで今まで通りの事はできそう。コンテストごとにディレクトリが分かれるの結構嬉しい。
カスタマイズ
デフォでも結構いい感じだけど、もっともーーっといろんな事ができるらしい。それをGreedではgreed.conf
というファイルに記述する。これに関しては結構膨大な感じに見受けられるので、またそのうち自分で設定することがあればまとめる。とりあえず、さっきのConfigure
のところで指定したディレクトリと同じ位置(つまり、コンテスト名のディレクトリが作成される位置)に、greed.conf
というファイルをとりあえず作成して置いておく。
C++のテンプレートを今まで使ってたやつと同じにしたい。
今回、とりあえずC++のテンプレートを自分が今まで使っていたものと同じものが読み込まれるようにだけは設定したいということでやってみる。まず、読み込ませたいファイルをSRMディレクトリ下に作る(my_template.cpp
とする)。
(2016/1/29 更新) Greedを使う場合、includeするヘッダにfstreamがないとGreedが生成するテストコードの中で使用しているのでコンパイルエラーになるのでそのincludeを追加。
#include <iostream> #include <string> #include <vector> #include <queue> #include <stack> #include <map> #include <algorithm> #include <set> #include <sstream> #include <utility> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <climits> #include <fstream> using namespace std; typedef long long ll; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) for(int i=0;i<(n);++i) #define foreach(itr,c) for(__typeof(c.begin()) itr=c.begin(); itr!=c.end(); itr++) class ${ClassName} { public: ${Method.ReturnType} ${Method.Name}(${Method.Params}) { return ${Method.ReturnType;zeroval}; } }; ${CutBegin} ${<TestCode} ${CutEnd}
そして、greed.conf
に、以下の1行を追加。
greed.language.cpp.templateDef.source.templateFile = my_template.cpp
これで、問題のとこのReload configuration
、Regenerate code
をすれば完了。
ひとまず完了
無事出来てよかった(レートも上がるといいんだが)。 gl & hf(これを見るたびつらい気持ちになる)