2013年10月21日月曜日

開発環境

『初めてのプログラミング 第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 ruby2.0
#-*- 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|
        c = roman[i]
        c = c.upcase
        n = r_n[c]
        return '有効なローマ数字になっていない!' unless n
        if n >= pre
            num += n
            pre = n
        else
            num -= n
        end
    end
    num
end

r1 = 'abcde'
r2 = 'mcmxcix'
[r1, r2].each do |roman|
    puts "#{roman}: #{roman_to_integer roman}"
end

入出力結果(Terminal)

$ ./sample.rb
abcde: 有効なローマ数字になっていない!
mcmxcix: 1999
$

ちなみにpython3.4の場合。

コード(BBEdit)

sample.py

#!/usr/bin/env python
#-*- 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
    for i in range(len(roman) - 1, -1, -1):
        c = roman[i]
        c = c.lower()
        if not c in r_n:
            return '有効なローマ数字になっていない!'
        n = r_n[c]
        if n >= pre:
            num += n
            pre = n
        else:
            num -= n
    return num
    
for roman in ['abcde', 'mcmxcix']:
    print('{0}: {1}'.format(roman, romanToInteger(roman)))

入出力結果(Terminal)

$ ./sample.py
abcde: 有効なローマ数字になっていない!
mcmxcix: 1999
$

0 コメント:

コメントを投稿