Tag Archive for 'contest'

CodeJam Qualification Round : SystemTestとおった

よかったー。 これでこのRoomでは11番ということになりました。750点問題が悔やまれてなりません。

しかし、こんなにもSystemTestでFailする人がいるとは… 早撃ちガンマンなだけではだめということなのですね。スピードと正確さでバランス良く解くのって難しそうだなぁと。

ランキングのスクリーンショット

ちょっと気になったのでとってみました。

Set 3の順位:

QualificationSet3

Set 3 Room 27の順位: ‘QualificationSet3-Room27

こんな感じでした。

Google CodeJam 2006 で使ったテンプレート

惨敗に終わったCodeJam 2006ですが、ちょっとだけTipsとか。

問題内容を公開してしまうのはルール上違反なのかもしれないので、問題とその解答は書きません。ですが、自分がCodeJamに望むにあたり、ちょっとでも早くコードを書き始めることができるようなテンプレートをつくっていました。 何かの役に立てればと思い公開してみます。

コードは続きにて。

工夫

  • 問題のクラス、メソッドなどをマクロにして差し替え可能に
  • テストケースをちょっとは簡単に記述できるように

使い方

  • XXXが書かれているコメントのところを、問題に合わせて書き直し
  • コンパイルオプションに -DLOCAL_TESTを加えて

やれば、動くんではないでしょうか。


/*
 * Google CodeJam 2006
 *
 * Template Code
 *
 * $Id: template.cc 320 2006-09-06 12:28:58Z takayama $
 */

/* ---------------------------------------------------------
 * XXX: 1. modify for each case
 */
#define CLASS Hoge
#define METHOD_RET int
#define METHOD_NAME hoge
#define METHOD_ARG_T vector < string >
#define METHOD_ARG ss
// ---------------------------------------------------------

#include <vector>
#include <string>
#include <algorithm>

#ifdef LOCAL_TEST
#include <iostream>
#include <cassert>
#endif // LOCAL_TEST

#define NELM(arr) ( sizeof((arr)) / sizeof((arr[0])) )

using namespace std;
typedef vector <string> VS_;
typedef vector <string>::iterator VSI_;
typedef vector <int> VI_;
typedef vector <int>::iterator VII_;

/* ---------------------------------------------------------
 * XXX: 2. Problem Solution
 */
class CLASS {
   public:
   METHOD_RET METHOD_NAME (METHOD_ARG_T METHOD_ARG);

   private:
};

METHOD_RET CLASS::METHOD_NAME (METHOD_ARG_T METHOD_ARG) {
   return 0;
}


/* ---------------------------------------------------------
 * Test
 */
#ifdef LOCAL_TEST
template <class T>
void test (T &test_case, METHOD_RET assumption) {
   CLASS obj;
   METHOD_RET ret;

   ret = obj.METHOD_NAME (test_case);

   cout << "assumption = " << assumption << ", "
        << "result = " << ret << endl;

   assert(assumption == ret);
}

void print_VS_(VS_& vs) {
   for (VSI_ i= vs.begin(); i != vs.end(); i++) {
      cout << *i << endl;
   }
}


/*
 * XXX: 3. add test cases here
 */
const int test_cases_length[] = {
   2,
   3,
};

const char *test_cases_arr[][256] = {
   {"hoge", "fuga"},
   {"moge", "yoga", "daru"},
};

/*
 * XXX: 4. add expected result here
 */
const int assumptions[] = {
   0,
   0,
};

vector <VS_> test_cases;


int main(int argc, char**argv) {
   size_t i;

   for (i=0; i < NELM(test_cases_arr); i++) {
      VS_ vs = VS_(
            test_cases_arr[i],
            test_cases_arr[i] + test_cases_length[i]);

      test_cases.push_back(vs);
   }

   for (i=0; i < test_cases.size(); i++) {
      test(test_cases[i], assumptions[i]);
   }

   return 0;
}
#endif // LOCAL_TEST

C++のtemplateをつかったら、もっときれいに書けるんだろうなぁとか思いますが、時間がなかったのでついついマクロにしてしまったり、テストケースの書き方がstring専用になってしまっていたりと美しくありません。 でもまぁ今回に関しては実用に足りたかなと。

CodeJam Qualification Round 750点問題

ぬおおっ、こっちの方が素早く解けてしまったっっっ!! しかも解答内容に自信あるし。テストケースちゃんと全部通るし。

しまったなぁ、こっちを最初からやっとけば300点くらいはとれたかもだなぁ。

とか言っても、けっきょく300点くらいではこのRoomのベスト10に入れるか入れないかくらいの成績でしかないわけで。きびしいなぁ。

あと、いま割とさっくりとできたのは時間外だからプレッシャーが少なかったというのもあると思います。やはりまだまだです。

ちなみに問題は、Permanentに関するものでした。


追記 :Official Rules and Regulations を読んでも特に問題なさそうなので、問題の概要を加えました。

CodeJam Qualification Round 結果

91.62pts

だめだ… OTZ

詳細

  • Qualification Set 3 Room 27
  • C++で
  • 250点問題のみ :(
  • 問題の理解に11分 :(
  • ようやく全てのテストケースが通ったのでSubmitしたのが残り1分21秒、ぎりぎりすぎ :(
  • そんなに難しい問題ではなかったのにぃ :(
  • コードの行数 : 213 (テストコード含む)
  • 750点問題は覗いただけ
  • 現時点で自分のRoomの23番なのでだめでしょう
  • 1位の得点がずばぬけてる (955.78 / 1000)。ありえない
  • 2, 3位の得点は660-700とまだありえるレベル

これでSystem Testing Phaseで落とされたらさらにげんなりだなぁ。

もう少ししたら (あと1時間) 終了の時間です。 最終結果はどうなることやら。いちおう終わりのときを待ってみることにします。 待つ間に750問題をやってみよう。

反省

  • 問題の理解遅すぎ
  • いきあたりばったり
  • gdbとかつかってると遅すぎ
  • 普段からエラーチェックをコンパイラまかせにしてコードを書いてるから、一発で通るまともなコードが書けない
  • 頭の回転遅め
  • 解き方が2つあって、やや迷ってしまった
  • Python覚えることにしよう
  • というか、いまさらman atoiとかしてる時点でアウトかも >_< (どのヘッダをincludeしないといけないか忘れていた)

とにかく頭の回転を速くしないといかんと痛感しました。猛烈にトレーニングしないとまずすぎです。

しかし、決められた時間内で問題を解くなんて久しぶりでした。やっぱりこういうの好きなのかも。TopCoderで鍛え直そうかな。

CodeJam Qualification Round開始

いそいそと準備のためのコードとか書いてるうちにこんな時間になってしまいました…

今から参戦してきます。結果は1時間後に。

CodeJam Practice : 1000点問題

いままでのことは忘れ、最後の練習問題である1000点問題に取り組んでいます。むずい!

ハノイの塔の変形なのだろうけどなぁ。むー。

他の人を見ても、あまり高得点者はいないみたい。そんなものなんかしら。

Google CodeJam 2006 日程

いよいよGoogle CodeJam 2006だーーーっっ。 意気込んで有給休暇を頂き、準備を整えることにしました。のですが、どうも時差の計算を間違えたのか何なのか、一日ずれていました。 てっきり今日の深夜から始まって、明日一日の勝負かと思っていたのに …

…ま、明日一日存分に予習をしてカンを取り戻しておくことができて良かったのかもしれません。本戦は明後日の夜 (締切ぎりぎり) にやるしかないかな。

いずれにせよ、この前みたいな無惨な結果にならないよう、がんばらないと。

ルール

ここで要項をおさらいしておきます。

Qualification Round Coding Phase

  • 24時間オープン
  • 問題は2問。難易度/得点が異なる2問
  • 制限時間は2問合わせて60分 (><)
  • 早ければ早いほど高得点
  • 問題をオープンした瞬間からカウントダウン
  • ラスト1時間 (日本時間で9/6の24:00-25:00) の途中から始めると損をする

Qualification Round System Testing Phase

  • 提出したコードが自動的にテストされる
  • まちがっていたら得点はゼロに

2問を60分かー。できるかしらん。


なんか受験の頃を思い出してきました。ちょっとワクワク。

Google Code Jam Practice

Practiceに2つ取り組んでいるうちに思ったこと。

求められているのは、

  • 問題が何を問うているかを見抜くこと
  • 最適なアルゴリズムを導きだせること
  • アルゴリズムを素早くコードに移すこと

あと、過去問を調べてみたところ、アルゴリズムとしてはグラフや文字列のマッチングが問題になることが多いみたい。Googleで実際に解くような問題っぽいですね。

こうした現実的な問題に対して、いかに素早く適切な解を出せるかというところが、Googleでは大事なのかなと思ったりしました。

Google Code Jam 2006 Practice 500

この前書いた Google Code Jam 2006 に続いて、500点問題にも取り組んでみました。

結果

  • 得点 : 150.1pts
  • 所要時間 : 4時間

だめだ…

感想

今回の問題は、割とアルゴリズムをイメージしやすかったので、けっこういけるんじゃないかなぁと期待していたのですが、だめでした。

  • きつい条件が1つだけあって、そこをクリアできない
  • 問題の理解間違い x 2

というか、どうも問題に納得いかないのです。例で上げられている答えのうち、最後のやつがどうしても14にならなくて。


結局240行くらいのコードになってしまいました。 高得点者のコード見てみたら、もうぜんぜんシンプルな。そんなんでできるんかい、と突っ込みChallengeしてみたら、見事に玉砕してしまいました。

世界にはすごい人々がいるのだなぁと。でもまだあきらめずにやってみます。

Google Code Jam 2006

Google Code Jam 2006 に参戦します。世界最高レベルのプログラマと対決するのです。

ということで、さっそくPracticeに挑んでみました。250pts問題を選んで、Problem Statementを読み、Constraintを理解し、手元の落書き帳でアルゴリズムをうんうん考えて、コードを書いてはテスト。テストが全て通ったところでsubmitしました。

結果

  • 得点 : 75.11pts / 250pts
  • 所要時間 : 4時間

しょぼっっっっっっっっっっ。(´・ω・`) 君にはがっかりだよ… (´・ω・`)

感想

簡単と言われる問題に対して、

  • 見通し悪く
  • 汚く
  • 見苦しく
  • テストも不十分な

コードを書きあげるのに、こんなに苦労するなんて。自分の腑甲斐無さにこみ上げてくる涙を押し止めることができません。

反省

高得点者のソースを見ながら自分の不足部分を考えてみました。

  • アルゴリズムに疎すぎ
  • グラフのアルゴリズム知らなすぎ
  • C++だから書きにくいんだ! なんて思いこんでいたけど、C++でも十分すっきりとしたコードは書けることを再確認

次はがんばるぞう。