Greedは高機能なので、ほとんど何の設定をしなくても、Arena参戦するのに困る事は無い。
しかし、他のSRM参加者のソースを見ていると、ソースの初めに
#define REP(i, N) for (int i = 0; i < (int)N; i++)
とか書かれていたりする。
これが、なんか出来る人っぽくてカッコいいので自分でも使ってみたくなった。というより、きっと、こういうのは定番なので、ちゃんと技術を盗んでいかねばならないのだ!!
greed.confファイルの作成
Greedの導入時の唯一の設定項目は、workspaceディレクトリを設定することだった。
Greedの設定は、その指定したworkspaceディレクトリ内にgreed.confというファイルを作って行うことになる。なので、とりあえず、空のgreed.confを用意する。
カスタマイズ用のテンプレートファイルの作成
greed.confの次に、テンプレートファイルと呼ばれるファイルを用意する。Greedは、アリーナから問題を開くことで、ローカルにソースやテストケースのファイルを作成してくれるが、この作成されるファイルのひな形をテンプレートファイルという。
そこで、デフォルトのテンプレートファイルに代えて、自分の好きなテンプレートファイルを作り、そのファイルをテンプレートファイルとして使いますよということをgreed.confで設定してあげれば目的が達成できるようだ。
まず、デフォルトのテンプレートファイル(C++用)の内容は以下の通り。
https://github.com/shivawu/topcoder-greed/blob/master/src/main/resources/templates/source/cpp.tmpl
このファイルをダウンロードして、「my_template.cpp」というファイル名にし、workspaceディレクトリに置く。このmy_template.cppを好きに書き換えることで、カスタマイズをする。
カスタマイズ用のテンプレートファイルとして指定する
先に述べた通り、カスタマイズ用のテンプレートを使うように設定するにはgreed.confに次の一行を書き込む。
greed.language.cpp.templateDef.source.templateFile = my_template.cpp
ここまでで、デフォルトと同じ状態のソースコードが生成される。
テンプレートファイルでは、${と}で囲まれた部分が、テンプレートエンジンによって置き換えが行われる部分で、それ以外の部分は、書いたらそのまま出力される。
なので、あまり難しく考えなくても、C++用のマクロは、テンプレートファイル前半部分にべた書きしておけばOK!
以前に紹介した、greedの設定を紹介してくれている人のページを参考にすると、インクルードファイルは#include <bits/stdc++.h>することで、必要そうな色々なものを呼び出してくれるらしいので、それにしてみた。
その他、C++の便利なマクロってどんなのがあるのかな?と思って検索してみると
TopCoderから学ぶ美しいマクロや型宣言 C++
というのが、みつかった。
そこで、初心者でもよく使いそうな奴だけ抜き出して整理してみた。
C++のマクロ
テンプレートファイルでは、${と}で囲まれた部分が、テンプレートエンジンによって置き換えが行われる部分で、それ以外の部分は、書いたらそのまま出力される。
なので、あまり難しく考えなくても、C++用のマクロは、テンプレートファイル前半部分にべた書きしておけばOK!
以前に紹介した、greedの設定を紹介してくれている人のページを参考にすると、インクルードファイルは#include <bits/stdc++.h>することで、必要そうな色々なものを呼び出してくれるらしいので、それにしてみた。
その他、C++の便利なマクロってどんなのがあるのかな?と思って検索してみると
TopCoderから学ぶ美しいマクロや型宣言 C++
というのが、みつかった。
そこで、初心者でもよく使いそうな奴だけ抜き出して整理してみた。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
//conversion | |
//------------------------------------------ | |
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;} | |
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();} | |
//typedef | |
//------------------------------------------ | |
typedef long long LL; | |
//repetition | |
#define FOR(i,a,b) for(int i=(a);i<(b);++i) | |
#define REP(i,n) FOR(i,0,n) | |
// Let's solve problem here | |
//------------------------------------------ | |
class ${ClassName} { | |
public: | |
${Method.ReturnType} ${Method.Name}(${Method.Params}) { | |
return ${Method.ReturnType;zeroval}; | |
} | |
}; | |
${CutBegin} | |
${<TestCode} | |
${CutEnd} |
もっと使いこなせるようになったら、付け足していけば良いのかなと思う。