Plus Life

とある大学生が気ままに書くブログ, Twitter(@hayato_plus)やってます。

GO FOR IT

SonyのGO FOR ITに挑戦してみました。

1) 人生の時計

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

i) 1990<=a<=2000,n=80のとき、今日は何時何分何秒ですか?
ii) 1900<=a<=2000,n=200のとき、今日は何時何分何秒ですか?

http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/q01.html

コード

use strict;
use warnings;

use DateTime;

my $now = DateTime->now( time_zone => 'Asia/Tokyo' );
my ($b, $c) = (9, 4);

print "i)\n";
foreach( 1990 ... 2000 ){
	watch( $_, 80 );
}
print "\n";

print "ii)\n";
foreach( 1900 ... 2000 ){
	watch( $_, 200 );
}

sub watch{
	my ($a,  $n) = @_;

	my $birth = DateTime->new( time_zone => 'Asia/Tokyo', year => $a, month => $b, day => $c );
	my $death = DateTime->new( time_zone => 'Asia/Tokyo', year => $a+$n, month => $b, day => $c );
	
	my $d1 = $death - $birth;
	my $d2 = $now - $birth;
	
	my $x = $d2->in_units( 'months' ) / $d1->in_units( 'months' ) * 24;
	
	my $hour = int( $x );
	my $min = int( ($x - $hour) * 60 );
	my $sec = int( ( ($x - $hour) * 60 - $min ) * 60 );

	print "a=$a, $hour時$min分$sec秒\n";
}

出力例

i)
a=1990, 6時25分29秒
a=1991, 6時7分30秒
a=1992, 5時49分30秒
a=1993, 5時31分29秒
a=1994, 5時13分29秒
a=1995, 4時55分29秒
a=1996, 4時37分30秒
a=1997, 4時19分30秒
a=1998, 4時1分29秒
a=1999, 3時43分30秒
a=2000, 3時25分29秒

ii)
a=1900, 13時22分12秒
a=1901, 13時15分0秒
a=1902, 13時7分48秒
a=1903, 13時0分36秒
a=1904, 12時53分24秒
a=1905, 12時46分11秒
a=1906, 12時39分0秒
a=1907, 12時31分48秒
a=1908, 12時24分36秒
a=1909, 12時17分23秒
a=1910, 12時10分11秒
a=1911, 12時3分0秒
a=1912, 11時55分47秒
a=1913, 11時48分35秒
a=1914, 11時41分23秒
a=1915, 11時34分12秒
a=1916, 11時27分0秒
a=1917, 11時19分48秒
a=1918, 11時12分36秒
a=1919, 11時5分23秒
a=1920, 10時58分12秒
a=1921, 10時50分59秒
a=1922, 10時43分48秒
a=1923, 10時36分35秒
a=1924, 10時29分24秒
a=1925, 10時22分11秒
a=1926, 10時15分0秒
a=1927, 10時7分47秒
a=1928, 10時0分35秒
a=1929, 9時53分24秒
a=1930, 9時46分11秒
a=1931, 9時39分0秒
a=1932, 9時31分48秒
a=1933, 9時24分36秒
a=1934, 9時17分23秒
a=1935, 9時10分11秒
a=1936, 9時3分0秒
a=1937, 8時55分47秒
a=1938, 8時48分35秒
a=1939, 8時41分23秒
a=1940, 8時34分12秒
a=1941, 8時27分0秒
a=1942, 8時19分48秒
a=1943, 8時12分36秒
a=1944, 8時5分23秒
a=1945, 7時58分12秒
a=1946, 7時50分59秒
a=1947, 7時43分48秒
a=1948, 7時36分35秒
a=1949, 7時29分24秒
a=1950, 7時22分11秒
a=1951, 7時15分0秒
a=1952, 7時7分47秒
a=1953, 7時0分35秒
a=1954, 6時53分24秒
a=1955, 6時46分12秒
a=1956, 6時39分0秒
a=1957, 6時31分48秒
a=1958, 6時24分36秒
a=1959, 6時17分24秒
a=1960, 6時10分11秒
a=1961, 6時2分59秒
a=1962, 5時55分47秒
a=1963, 5時48分36秒
a=1964, 5時41分24秒
a=1965, 5時34分12秒
a=1966, 5時27分0秒
a=1967, 5時19分48秒
a=1968, 5時12分35秒
a=1969, 5時5分23秒
a=1970, 4時58分12秒
a=1971, 4時50分59秒
a=1972, 4時43分48秒
a=1973, 4時36分35秒
a=1974, 4時29分24秒
a=1975, 4時22分12秒
a=1976, 4時15分0秒
a=1977, 4時7分47秒
a=1978, 4時0分35秒
a=1979, 3時53分23秒
a=1980, 3時46分11秒
a=1981, 3時38分59秒
a=1982, 3時31分48秒
a=1983, 3時24分36秒
a=1984, 3時17分24秒
a=1985, 3時10分11秒
a=1986, 3時2分59秒
a=1987, 2時55分48秒
a=1988, 2時48分36秒
a=1989, 2時41分23秒
a=1990, 2時34分12秒
a=1991, 2時27分0秒
a=1992, 2時19分48秒
a=1993, 2時12分35秒
a=1994, 2時5分23秒
a=1995, 1時58分11秒
a=1996, 1時51分0秒
a=1997, 1時43分47秒
a=1998, 1時36分35秒
a=1999, 1時29分23秒
a=2000, 1時22分12秒

アルゴリズム

  1. 命日-誕生日(d1)と現在の日付-誕生日(d2)をそれぞれ計算(単位:月)
  2. d2 / d1 * 24 で誕生日から現在の日付までの計算(単位:時間)
  3. 単位を小数点を含む時間から、x時間y分z秒に変換

実行について

プログラム言語

perl

実行方法

perl code.pl

必要モジュール

DateTime