2013年10月11日金曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 9章(自作メソッドの書き方), 9.5(練習問題)、モダンなローマ数字、を解いてみる。

その他参考書籍

モダンなローマ数字

コード(BBEdit)

sample.rb

#!/usr/bin/env ruby2.0
#-*- coding: utf-8 -*-

def roman_numeral nums
    result = ""
    num_roman = {1000 => 'M',
                 100 => {5 => 'D',
                         1 => 'C'},
                 10 => {5 => 'L',
                        1 => 'X'},
                 1 => {5 => 'V',
                       1 => 'I'}}
    keys = num_roman.keys.sort.reverse
    k = keys.shift
    n = nums / k
    nums = nums % k
    c = num_roman[k]
    pre_c = c
    result += c * n
    keys.each do |k|
        roman = num_roman[k]
        roman_five = roman[5]
        roman_one = roman[1]
        n = nums / k
        nums = nums % k
        if n == 9
            result += roman_one + pre_c
        elsif n == 4
            result += roman_one + roman_five
        else
            result += roman_five * (n / 5)
            result += roman_one * (n % 5)
        end
        pre_c = roman_one
    end
    result
end

puts roman_numeral 4
puts roman_numeral 9
(1010..1020).each do |n|
    puts "#{n}: #{roman_numeral n}"
end

入出力結果(Terminal)

$ ./sample.rb
IV
IX
1010: MX
1011: MXI
1012: MXII
1013: MXIII
1014: MXIV
1015: MXV
1016: MXVI
1017: MXVII
1018: MXVIII
1019: MXIX
1020: MXX
$

ちなみにpython3.3の場合。

コード(BBEdit)

sample.py

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

def oldRomanNumeral(nums):
    result = ''
    num_roman = {
        1000: 'M',
        100: {5: 'D', 1: 'C'},
        10: {5: 'L', 1: 'X'},
        1: {5: 'V', 1: 'I'}
    }
    keys = sorted(num_roman.keys(), reverse=True)
    k = keys.pop(0)
    n = nums // k
    nums = nums % k
    c = num_roman[k]
    pre_c = c
    result += c * n
    for k in keys:
        roman = num_roman[k]
        roman_five = roman[5]
        roman_one = roman[1]
        n = nums // k
        nums = nums % k
        if n == 9:
            result += roman_one + pre_c
        elif n == 4:
            result += roman_one + roman_five
        else:
            result += roman_five * (n // 5)
            result += roman_one * (n % 5)
        pre_c = roman_one
    return result

print(oldRomanNumeral(4))
print(oldRomanNumeral(9))
for n in range(1010, 1021):
    print('{0}: {1}'.format(n, oldRomanNumeral(n)))

入出力結果(Terminal)

$ ./sample.py
IV
IX
1010: MX
1011: MXI
1012: MXII
1013: MXIII
1014: MXIV
1015: MXV
1016: MXVI
1017: MXVII
1018: MXVIII
1019: MXIX
1020: MXX
$

0 コメント:

コメントを投稿