06 September 2009

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(vector  inputs)
{
  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;
  vector  tmp;
  vector  args;

  getline(file, line);
  tmp = split(line, " ");
  for (int i=0; i

  for (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)
{
  vector  ret;
  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;