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