2012年12月29日土曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 12章(新しいクラスのオブジェクト), 12.6(練習問題の続き)バースデーヘルパー を解いてみる。

その他参考書籍

バースデーヘルパー

コード(BBEdit)

sample.rb

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-

birth_dates = {}
name = 'birth_day_helper'
File.open(name).each_line do |line|
  line = line.chomp
  name, mon_day, year = line.split(",")
  mon, day = mon_day.split
  birth_dates[name.strip] = {:year => year.to_i, 
                             :mon => mon.strip, 
                             :day => day.strip.to_i}
end
while true
  print "名前を入力: "
  name = gets.chomp
  break if name =~ /^\s*$/
  birth_date = birth_dates[name]
  next unless birth_date
  birth = Time.gm(birth_date[:year], birth_date[:mon], birth_date[:day])
  age = 0
  td = Time.new
  while Time.gm(birth.year + age, birth.mon, birth.day) <= td
    age += 1
  end
  age -= 1
  puts "誕生日:#{birth.year}-#{birth.mon}-#{birth.day} 年齢:#{age}歳"
end

入出力結果(Terminal)

$ ./sample.rb
名前を入力: The King of Spain
誕生日:2000-12-30 年齢:11歳
名前を入力: Christopher Lloyd
誕生日:2000-12-29 年齢:12歳
名前を入力: Christopher Plummer
誕生日:2000-12-28 年齢:12歳
名前を入力: kamimura
名前を入力: 
$

ちなみにJavaScriptの場合。

コード(BBEdit)

var result = "";
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,    Dec 28, 2000\n' +
  'Christopher Lloyd,      Dec 29, 2000\n' +
  'The King of Spain,      Dec 30, 2000';
var mon_to_i = {"Jan":1,"Feb":2,"Mar":3,"Apr":4,
                "May":5,"Jun":6,"Jul":4,"Aug":8,
                "Sep":9,"Oct":10, "Nov":11,"Dec":12}
var birth_dates = {};
var lines = birth_day_helper.split("\n");
for(var i = 0; i < lines.length; i++){
  var name_and_mon_day_and_year = lines[i].split(",");
  var name = name_and_mon_day_and_year[0].trim();
  var mon_day = name_and_mon_day_and_year[1].trim().split(/\s+/);
  var mon = mon_day[0].trim();
  var day = mon_day[1].trim();
  var year = name_and_mon_day_and_year[2];
  birth_dates[name] = new Date(year.trim(), mon_to_i[mon.trim()] - 1, day.trim());
}
var name = $('#t0').val();
if(! birth_dates[name]){
  result += "リストに名前がありません。\n";
} else {
  var birth_date = birth_dates[name];
  var age = 0;
  var td = new Date();
  var date= new Date(birth_date.getYear() + 1900, birth_date.getMonth(), birth_date.getDate());
  while(date <= td){
    age += 1;
    date.setYear(date.getYear() + 1900 + 1);
  }
  age -= 1;
  result += "誕生日:" + birth_date + " 年齢:" + age + "歳\n";
}
$('#pre0').text(result);





pythonの場合。

sample.py

コード(BBEdit)

#!/usr/bin/env python3.3
# -*- coding: utf-8 -*-

import datetime, re

mon_to_i = {"Jan":1,"Feb":2,"Mar":3,"Apr":4,
              "May":5,"Jun":6,"Jul":4,"Aug":8,
              "Sep":9,"Oct":10, "Nov":11,"Dec":12}
birth_dates = {}
for line in open('birth_day_helper'):
    name, mon_day, year = line.split(",")
    mon, day = mon_day.split()
    birth_dates[name.strip()] = datetime.date(int(year), mon_to_i[mon.strip()], int(day))

while True:
    name = input("名前を入力: ")
    if re.match(r"^\s*$", name): break
    if not name in birth_dates:
        continue
    birth_date = birth_dates[name]
    date = birth_date
    age = 0
    td = datetime.date.today()
    while date <= td:
        age += 1
        date = date.replace(year= birth_date.year + age)
    else:
        age -= 1
    print("誕生日:{0} 年齢:{1}歳".format(birth_date, age))

入出力結果(Terminal)

$ ./sample.py
名前を入力: Christopher Plummer
誕生日:2000-12-28 年齢:12歳
名前を入力: Christopher Lloyd
誕生日:2000-12-29 年齢:12歳
名前を入力: The King of Spain
誕生日:2000-12-30 年齢:11歳
名前を入力: kamimura
名前を入力: 
$

0 コメント:

コメントを投稿