開発環境
- 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 コメント:
コメントを投稿