開発環境
- 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 コメント:
コメントを投稿