2012年2月6日月曜日

Sony「go for it」 問題1 人生の時計

問題1












1.ソースコード
こちらをダウンロードしてください。文字コードはShift-JISです。

2.回答できた問題の出力
i)

※提出した書類では入力を誤っていました。修正は不可能ですが、
ブログ上のスクリーンショットは変更しておきます。

ii)













3.アルゴリズムの簡単な説明
まずはミリ秒で3つの値を出す

  • 自分の誕生日(a/b/c 0:00:00:000)
  • 自分が死ぬ日(a+(n+1)/b/c 23:59:59:999) 
  • 今の時間


それぞれを引くことで以下の値を出す

  • 自分が死ぬ時間-誕生日(自分が何ミリ秒生きられるか)
  • 今の時間-誕生日(今何ミリ秒生きているか)


自分が何ミリ秒生きられるかを24時間に縮小する。
自分が何ミリ秒生きられるか/86400000(ミリ秒)

そうすると仮想1ミリ秒辺りの時間が出るので、

今何ミリ秒生きているか仮想1ミリ秒辺りの時間 で割る。

そうすると自分が仮想何ミリ秒生きてるかが出るので、
それを出力。

です。基本的に日付の処理はJavaのCalendarクラスが行なってくれています…
問題の趣旨と違っていたら申し訳ございません。

4.動作方法
二つのクラスで構成されています。
Main.java
引数を受け取り、上に示したプログラムを行うクラス
MyDate.java
Main内で利用される日付オブジェクト。
Calendarクラスのインスタンスを持っており、初期化やMyDateオブジェクト同士の引き算、日付をミリ秒で出力などの機能が備わっています。

5.実行方法
まずは各自ダウンロードしたディレクトリでコマンドプロンプトを起動します。





次にコンパイルです。





実行の際には、
誕生年(半角スペース)誕生月(半角スペース)誕生日(半角スペース)何年生きられるか
を引数として入力します。
















ライセンスは特にありません。オープンソースでご自由にお使い下さい。
30分くらいで最後の1行まで終わったのですが、なぜかミリ秒を月:日:秒:ミリ秒に変換するのに手こずってこんな時間になってしまいました。。
そしてそのミリ秒を日付に変換するアルゴリズムも恥ずかしいものになっています(笑)

他の問題もこれからチャレンジしていこうと思います!

2 件のコメント:

  1. ちなみにサンプルはこう解きました
    (こちらは立方体の大きさや座標を変える場合、mainメソッド内のコンストラクタを変更する必要があります。)
    https://skydrive.live.com/redir.aspx?cid=b103a6af072897d2&resid=B103A6AF072897D2!273&parid=B103A6AF072897D2!102&authkey=!AG-I_EjtTCFw4_A

    上のコードとこのコードを見ると、「こいつ数学嫌いだな」って思われてしまうかもしれません(笑)アルゴリズムを最適化するのも大好きなのですが、カプセル化することで振る舞いさえ正しければそれでいいという考え方も面白いと思います。

    とか言いながらgetter使ってないですが…

    返信削除
  2. もう本家とは関係ありませんが、せっかく作ったのでGUIもつけてみました。
    https://skydrive.live.com/redir.aspx?cid=b103a6af072897d2&resid=B103A6AF072897D2!274&parid=B103A6AF072897D2!102&authkey=!AEnXNciHp4MOFQA
    ※もちろんウィルスなどは入れていませんが、実行可能形式での配布ですので、気になる方は事前にチェックすることをお勧めします。

    75歳まで生きられるとしたらまだ7時ですか…

    返信削除