天下一プログラマーコンテスト
こちらでKLab株式会社さんが開催している、天下一プログラマーコンテストの第1回予選に参加してきました。
まだ7月15日、25日と予選が残ってますが、
7月5日に開催された予選について書きます。
選択可能な言語は、PHP、Ruby、Python、Perl、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%ほどに抑える事が出来ます。
次回へ続く。