C++のスケルトンのジェネレータ - Google Code Jam
Google Code Jamで、ヘッダやファイルの読み込みなどコードは毎回共通なので、それらを自動制するスクリプトを書きました。Perlを使ってみました。
問題名と作成するパスを渡すと、そのパスに問題名と同名のディレクトリを作り、その中に問題名と同名のcppファイル、testinput、testoutputという3つのファイルを作ります。cppファイルがスケルトンのコード。test*はサンプルのインプットをコピペする用のファイルです。
スケルトンができた後は、必要ならばmain関数の入出力あたり、そしてメインのロジックをrunという関数の中に書きます。その後このようにコンパイルします。
g++ -Wall -O2 problemName.cpp && ./a.out
ジェネレータのコードはこんなんです。
#!/usr/bin/perl # ================================================ # booting script for google code jam 2009 # ================================================ use strict; use warnings; # =============== # parse arguments # =============== # how to get argv[0] my $probName = shift; my $path = shift or die("Useage: $0\n"); # =============== # prepare directories, etc. # =============== my $probPath = $path . "/" . $probName; unless (-d $probPath) { system "mkdir $probPath"; } system "touch " . $probPath . "/testinput"; system "touch " . $probPath . "/testoutput"; # =============== # print code # =============== my $cppName = $probPath . "/" . $probName . ".cpp"; open my $fh, ">", "$cppName"; print $fh <<'END'; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; vector split(const string _s, const string del); int toInt(string s) {int r = 0; istringstream ss(s); ss >> r; return r;} string toStr(int n) {ostringstream ss; ss << n; return ss.str();} string run(vectorinputs) { string ret; return ret; } int main(int argc, char ** argv) { if (argc != 1 && argc != 3) { cout << "Usage " << argv[0] << " \n"; return 0; } ifstream file (argv[1]); string line; vectortmp; vectorargs; getline(file, line); tmp = split(line, " "); for (int i=0; ifor (int lineNum = 0; lineNum { string result; getline(file, line); result = run(line); cout << "Case #" << lineNum+1 << ": " << result << endl; } return 0; } vector split(const string _s, const string del) { vectorret; string s = _s; while (!s.empty()) { size_t pos = s.find(del); string sub = ""; sub = s.substr(0, pos); ret.push_back(sub); if (pos != string::npos) pos += del.size(); s.erase(0, pos); } return ret; } END close $fh;