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