2013年2月4日月曜日

開発環境

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

その他参考書籍

roman_to_integer 'mcmxcix'!

コード(BBEdit)

sample.rb

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

def roman_to_integer roman
  num = 0
  r_n = {
    'M' => 1000,
    'D' => 500,
    'C' => 100,
    'L' => 50,
    'X' => 10,
    'V' => 5,
    'I' => 1}
  pre = 0
  (roman.length - 1).downto(0) do |i|
    n = r_n[roman[i].upcase]
    return "有効なローマ数字ではありません!" unless n
    if n < pre
      num -= n
    else
      num += n
      pre = n
    end
  end
  num
end

puts roman_to_integer "abcde"
puts roman_to_integer 'mcmxcix'

入出力結果(Terminal)

$ ./sample.rb
有効なローマ数字ではありません!
1999
$

ちなみにJavaScriptの場合。

コード(BBEdit)

function romanToInteger( roman ) {
    var num = 0,
        r_n = {
            'm': 1000,
            'd': 500,
            'c': 100,
            'l': 50,
            'x': 10,
            'v': 5,
            'i': 1
        },
        pre = 0,
        n, i;
    for (i = roman.length - 1; i >= 0; i -= 1) {
        n = r_n[roman[i].toLowerCase()];
        if (!n) {
            throw {
                type: "エラー",
                message: "有効なローマ数字ではありません!"
            };
        }
        if ( n < pre ) {
            num -= n;
        } else {
            num += n;
            pre = n;
        }
    }
    return num;
}
try{
    var roman = $('#roman').val();
    $('#pre0').text(romanToInteger( roman ));
} catch (e) {
    $('#pre0').text(e.type + ": " + e.message);
}





pythonの場合。

sample.py

コード(BBEdit)

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

def romanToInteger(roman):
    num = 0
    r_n = {
            'm': 1000,
            'd': 500,
            'c': 100,
            'l': 50,
            'x': 10,
            'v': 5,
            'i': 1
          }
    pre = 0
    roman = list(roman)
    roman.reverse()
    for ch in roman:
        ch = ch.lower()
        if not ch in r_n.keys():
            raise Exception("有効なローマ数字ではありません!")
        n = r_n[ch]
        if n < pre:
            num -= n
        else:
            num += n
            pre = n
    return num

try:
    print(romanToInteger('mcmxcix'))
    print(romanToInteger('abcdefg'))
except Exception as err:
    print(err)

入出力結果(Terminal)

$ ./sample.py
1999
有効なローマ数字ではありません!
$

perlの場合。

sample.pl

コード(BBEdit)

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

sub roman_to_integer {
    my $roman = shift;
    my $num = 0;
    my %r_n = ( 'm' => 1000,
                'd' => 500,
                'c' => 100,
                'l' => 50,
                'x' => 10,
                'v' => 5,
                'i' =>1 );
    my $pre = 0;
    my $n;
    for ( reverse( split "", $roman ) ) {
        $n = $r_n{lc $_};
        return "有効なローマ数字ではありません!" unless $n;
        if ($n < $pre) {
            $num -= $n;
        } else {
            $num += $n;
            $pre = $n;
        }
    }
    $num;
}
print roman_to_integer('mcmxcix') . "\n";
print roman_to_integer('abcdefg') . "\n";

入出力結果(Terminal)

$ ./sample.pl
1999
有効なローマ数字ではありません!
$

0 コメント:

コメントを投稿