[Go For It]人生の時計
Sonyが主催するソフトウェアスペシャリストコンテスト Go For Itなるものが昨日から始まりましたね。
現実逃避をするためにとりあえず一問Pythonで解いてみましたよ。
https://github.com/shogo82148/GoForIt/tree/master/q01
日付の処理って結構面倒なので、僕が参加しているような競技プログラムではあんまり見かけませんね(ただ単に経験が浅いだけかもしれないけど)。
問題の意図するところはよくわかりませんが、面倒な日付計算はすべてライブラリにお任せして書いてみました。
単純に(現在時刻-誕生日)/(亡くなる時刻-誕生日)を求めるだけです。
計算自体はそう難しくはありませんが、2つほど注意するところがあります。
1つ目は死ぬ時刻。例えば2000年1月1日午前0時ちょうどに生まれて、80歳まで生きるとしましょう。
問題文には「n歳のときは生きていてn+1歳にはなれない」とあります。問題文では例が示されていませんが、僕は以下のように解釈しました。
2080年1月1日から2080年12月31日はちょうど80歳なので生きています。2081年1月1日になった瞬間、81歳になってしまうので亡くなることになります。
つまりこの場合、上の式の「亡くなる時刻」は2081年1月1日となります。
2つ目は閏年の存在。
今度は、2000年2月29日に生まれて、99歳まで生きるとしましょう。さて、亡くなるのはいつでしょう?
残念ながら2100年2月29日ではありません。2100年は閏年ではないので2月は28日で終わってしまいまい、2月29日は存在しないのです。閏日 - Wikipediaによると、2月29日生まれの人は2月28日が終わった時に年齢が変わるそうです。つまり、この答えは2100年3月1日午前0時ということになります。
問題の解釈とか、プログラムとか間違ってたら教えてください。
追記
閏年の判定は言語によっては不要で、JavaScriptとかだと2100年2月29日を指定してもエラーにはならず2100年3月1日として扱われるみたい。
Pythonだとダメだった。