2013年2月5日火曜日

開発環境

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

その他参考書籍

バースデーヘルパー

コード(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 コメント:

コメントを投稿