2012年2月8日水曜日

SONY GO FOR IT 1問目:人生の時計

問題文
1)人生の時計


あなたの一生を24時間にたとえると今日は何時何分何秒ですか?
ただしあなたはあなたの誕生日(a年b月c日)の0時ちょうどに生まれてn歳まで生きる(n歳のときは生きていてn+1歳にはなれない)とし、bとcは一般的な月日の範囲とします。
i) 1990<=a & a<=2000,n=80のとき、今日は何時何分何秒ですか?
ii)  1900<=a & a<=2000 ,n=200のとき、今日は何時何分何秒ですか?

2)解き方
C++を利用して解いた。
有名なヘッダファイルであるctimeは、Unix時間という制約がかかるため、tm構造体だけを利用した。
(死ぬ時間 - 生年月日) : (現在時刻 - 生年月日) = 24時間 (24*60*60秒) : x時間
であり、このx時間を求めれば良い。

3)疑問点
n歳まで生きる(n歳のときは生きていてn+1歳にはなれない)
これは、死ぬのが誕生日前日の23時59分59秒でいいのだろうか。
どこで区切れば良いのか分からなかった為に死ぬ日を設定出来るというメンバ関数を用意した。
ただし、本問題中では前日であると判断したので出力ファイルには書かれていない。

4)苦労した点
Unix時間のことを忘れていた。
i)しか見ていなかった為、問題無いだろうと判断してしまった。
この為、ソースが汚くなってしまった。
また、日付計算関数などを自分で用意するという事になってしまった。

5)ライセンス
BSDライセンス *最初の頃に載せていたソースにあったライセンスは、Google IncのMozcからコピーさせてもらったもので、Google Incとか書かれていたけど、何も関係ないです。ごめんなさい。

6)出力ファイル


i)1990<=a<=2000,n=80
Input
        Birth Day:1994/12/3
        Death Age:80<2075/12/2>
Output
        5:5:30
Input
        Birth Day:1995/1/1
        Death Age:80<2075/12/31>
Output
        5:4:5
Input
        Birth Day:1998/7/31
        Death Age:80<2079/7/30>
Output
        4:0:28


ii)1900<=a<=2000,n=200
Input
        Birth Day:1946/5/7
        Death Age:200<2147/5/6>
Output
        7:51:7
Input
        Birth Day:1979/7/1
        Death Age:200<2180/6/31>
Output
        3:53:37

1946年はソニー創業日らしい、1979年7月1日はウォークマンの日らしい、1994年12月3日はプレステの日らしい

7)ソースファイル
クラス(ヘッダソース)
メイン(ソース)


#追記 2/8バグ修正した