開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- Ruby (プログラミング言語)
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 9章(自作メソッドの書き方), 9.5(練習問題)、モダンなローマ数字、を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
モダンなローマ数字
コード(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 コメント:
コメントを投稿