裏紙

ほぼ競プロ、たまに日記

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みたいな行が追加されるので、DefaultAt 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 configurationRegenerate codeをすれば完了。

ひとまず完了

無事出来てよかった(レートも上がるといいんだが)。 gl & hf(これを見るたびつらい気持ちになる)