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秒
アルゴリズム
- 命日-誕生日(d1)と現在の日付-誕生日(d2)をそれぞれ計算(単位:月)
- d2 / d1 * 24 で誕生日から現在の日付までの計算(単位:時間)
- 単位を小数点を含む時間から、x時間y分z秒に変換