天下一プログラマーコンテスト

こちらでKLab株式会社さんが開催している、天下一プログラマーコンテストの第1回予選に参加してきました。


まだ7月15日、25日と予選が残ってますが、
7月5日に開催された予選について書きます。


選択可能な言語は、PHPRubyPythonPerl、C、C++Javaの中のどれか1つ。
言語的に一番馴染みがあるVBがないので、とりあえずC++を選択しました。
TopCoderとかで使ってるテンプレを使い回そうかと思ったけど、エレガントじゃなくなりそうなのでやめました。
問題は全部で3問あり、3問とも回答しなさいと書かれてました。
という事は・・・


1問でも解けない問題があると終わりなのか?!


不安倍増。果たして自分は3問とも解く事が出来るのでしょうか。
おそるおそる1問目を開きます。

問題1.
yyyy年mm月dd日〜YYYY年MM月DD日の間に、X曜日は何回出現するか。


こんな感じの問題でした。


やっぱり母国語ってイイ!!


今まで英語の問題ばかり解いてきた身としては、日本語のありがたさがよく分かります。
だって、


問題文の意味を理解する時間を考えなくていいんですから。


TopCoderとかやってると、場合によっては意味を理解する前に終了してしまう事も。


自分の英語力のなさがよく伺えます。


素直に問題の要件しか満たさないものを組もうかと思いましたが、
エレガントなコードというのがマジでわけわからんので、
(ソースコードから容易に理解できるようにとか書いてあるのに、CODE GOLFがどうとか意味分かりませんから。)
わざわざ汎用化して、日付や曜日を自由に指定して算出できるようにしました。
例えば-2000年1月1日〜10000年12月31日で月曜日が出てくる回数、とか。
これが吉と出るか凶と出るかは自分には分かりません。


たったこれだけのプログラムを作るのに、1時間30分もかかってしまいました。


決勝なら余裕でタイムアウトしてそうです。


・・・でも、ちょっと言い訳させてください。


向こう側のメール配信システムの不具合で、予選に関するメールが送られてきたのは0時47分。
予選の開催時間は0時。
てっきり、第1回目の予選はエントリーが遅すぎたのかと思って


完全に投げて遊んでました。


確かUSL-5PにLinux入れてました・・・(遠い目)。
メールに気づいたのは1時30分。


予選、既に始まってるし。


別に提出時間は考慮しないみたいだから、いいんですが・・・


大きく出鼻をくじかれました。


モチベーションは急降下です。


でも、そうも言っていられないので続けて2問目も解きます。。


ちなみに、1問目の答えは「52177」と出ました。
皆さんはどうでしたか?
ループを回してカウントしていく方法なら、1万年なら約365万回のループ+αもあれば十分なので
問題文の要件のみであれば、約36万5000回のループを回すだけで解けますね。
実際はX曜日は7日ごとに現れるので、更にループ回数を15%ほどに抑える事が出来ます。


次回へ続く。