開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語:Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 12章(新しいクラスのオブジェクト), 12.6(練習問題の続き)バースデーヘルパー を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
バースデーヘルパー
コード(BBEdit)
sample.rb
#!/usr/bin/env ruby1.9
#-*- coding: utf-8 -*-
filename = 'birth_day_helper'
birth_day = {}
(File.open filename).each_line do |line|
name, m_d, y = line.split ","
birth_day[name.strip] = Time.local(y, *m_d.split)
end
# ほとんど速度に関係ないけど、とりあえずメモ化も使ってみる
ages = {}
while true
print "名前を入力: "
name = gets.chomp
break if name =~ /^\s*$/
b = birth_day[name]
if birth_day[name]
print "誕生日: #{birth_day[name]}"
if ages[name]
puts "#{ages[name]}歳"
else
age = 1
td = Time.new
by = b.year
bm = b.mon
bd = b.day
while Time.local(by + age, bm, bd) <= td
age += 1
end
ages[name] = age - 1
puts "(#{age - 1}歳)"
end
else
puts "その名前はファイルにありません。"
end
end
入出力結果(Terminal)
$ ./sample.rb 名前を入力: Christopher Plummer 誕生日: 2000-02-04 00:00:00 +0900(13歳) 名前を入力: Christopher Lloyd 誕生日: 2000-02-05 00:00:00 +0900(13歳) 名前を入力: The King of Spain 誕生日: 2000-02-06 00:00:00 +0900(12歳) 名前を入力: ruby その名前はファイルにありません。 名前を入力: $
ちなみにJavaScriptの場合。
コード(BBEdit)
var birth_day_helper = 'Christopher Alexander, Oct 18, 1936\n' +
'Christopher Lambert, Mar 29, 1957\n' +
'Christopher Lee, Oct 18, 1950\n' +
'Christopher Pine, Nov 20, 2020\n' +
'Christopher Plummer, Feb 4, 2000\n' +
'Christopher Lloyd, Feb 5, 2000\n' +
'The King of Spain, Feb 6, 2000\n',
birth_day = {},
lines = birth_day_helper.split("\n"),
name = $('#name_birth').val().trim(),
result = "",
age = 0,
td = new Date(),
line, i, b;
for (i = 0, max = lines.length; i < max; i += 1) {
line = lines[i].split(",");
birth_day[line[0].trim()] = new Date(line[1] + line[2]);
}
b = birth_day[name];
if (b) {
result += b.getFullYear() + "-" + (b.getMonth() + 1) + "-" + b.getDate();
b.setFullYear(b.getFullYear() + 1);
while ( b <= td ){
age += 1;
b.setFullYear(b.getFullYear() + 1);
}
result += "(" + age + "歳)";
} else {
result += "その名前はリストにありません";
}
$('#pre0').text(result);
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-
import datetime, re
filename = "birth_day_helper"
birth_day = {}
months = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8,
"Sep":9, "Oct":10, "Nov":11, "Dec":12}
with open(filename) as f:
for line in f:
line = line.split(",")
name = line[0].strip()
m, d = line[1].split()
d = int(d)
m = months[m]
y = int(line[2])
birth_day[name] = datetime.datetime(y,m,d)
while True:
name = input("名前を入力: ")
if re.search(r"^\s*$", name): break
if name in birth_day:
b = birth_day[name]
age = 1
td = datetime.datetime.today()
while b.replace(year=b.year + age) <= td:
age += 1
else:
age -= 1
print("誕生日: {0}({1}歳)".format(b.strftime("%Y-%m-%d"), age))
else:
print("その名前はファイルにありません。")
入出力結果(Terminal)
$ ./sample.py 名前を入力: Christopher Plummer 誕生日: 2000-02-04(13歳) 名前を入力: Christopher Lloyd 誕生日: 2000-02-05(13歳) 名前を入力: The King of Spain 誕生日: 2000-02-06(12歳) 名前を入力: python その名前はファイルにありません。 名前を入力: $
perlの場合。
sample.pl
コード(BBEdit)
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use Time::Local;
my %birth_day = qw();
my %month = ("Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4,
"May" => 5, "Jun" => 6, "Jul" => 7, "Aug" => 8,
"Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12);
open my $fh, "<", "birth_day_helper" or die $!;
while (<$fh>) {
chomp;
my($name, $m_d, $y) = split ",";
my($m, $d) = split " ", $m_d;
$m = $month{$m} - 1;
$birth_day{$name} = timelocal(0, 0, 0, $d, $m, $y);
}
close $fh;
my $td = timelocal(0,0,0, (localtime)[3,4,5]);
while (1) {
print "名前を入力: ";
chomp( my $name = <STDIN>);
last if $name =~ /^\s*$/;
my $b = $birth_day{$name};
if ($b) {
my $age = 1;
my $tm = $b;
my($mday, $mon, $year) = (localtime $b)[3, 4, 5];
while ($tm <= $td) {
$age += 1;
$tm = timelocal(0,0,0,$mday, $mon, $year + $age);
}
$age -= 1;
printf "誕生日: %04d-%02d-%02d(%d歳)\n", $year + 1900, $mon + 1, $mday, $age;
} else {
print "その名前はファイルにありません。\n";
}
}
入出力結果(Terminal)
$ ./sample.pl 名前を入力: Christopher Plummer 誕生日: 2000-02-04(13歳) 名前を入力: Christopher Lloyd 誕生日: 2000-02-05(13歳) 名前を入力: The King of Spain 誕生日: 2000-02-06(12歳) 名前を入力: perl その名前はファイルにありません。 名前を入力: $
0 コメント:
コメントを投稿