開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語: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 ruby1.9
#-*- coding: utf-8 -*-
def roman_numeral n
roman = 'M' * (n / 1000)
n = n % 1000
h = n / 100
n = n % 100
t = n / 10
o = n % 10
if h != 9 and h != 4
roman += 'D' * (h / 5)
roman += 'C' * (h % 5)
elsif h != 9
roman += 'CD'
else
roman += 'CM'
end
if t != 9 and h != 4
roman += 'L' * (h / 5)
roman += 'X' * (h % 5)
elsif t != 9
roman += 'XL'
else
roman += 'XC'
end
if o != 9 and o != 4
roman += 'V' * (o / 5)
roman += 'I' * (o % 5)
elsif o != 9
roman += 'IV'
else
roman += 'IX'
end
roman
end
[4,42,458,4569].each do |n|
puts "#{n}: #{roman_numeral n}"
end
入出力結果(Terminal)
$ ./sample.rb 4: IV 42: II 458: CDXLVIII 4569: MMMMDLIX $
ちなみにJavaScriptの場合。
コード(BBEdit)
function repeat_string(s, n){
var result = "";
for(var i = 0; i < n; i++){
result += s;
}
return result;
};
var roman_numeral = function(n){
var roman = repeat_string('M', Math.floor(n / 1000));
n = Math.floor(n % 1000);
var h = Math.floor(n / 100);
n = Math.floor(n % 100);
var t = Math.floor( n / 10);
var o = Math.floor(n % 10);
if(h !== 9 && h !== 4){
roman += repeat_string('D', Math.floor(h / 5));
roman += repeat_string('C', Math.floor(h % 5));
} else if(h !== 9){
roman += 'CD';
} else {
roman += 'CM';
}
if(t !== 9 && t !== 4){
roman += repeat_string('L', Math.floor(t / 5));
roman += repeat_string('X', Math.floor(t % 5));
} else if (t !== 9){
roman += 'XL';
} else {
roman += 'XC';
}
if( o !== 9 && o !== 4){
roman += repeat_string('V', Math.floor( o / 5));
roman += repeat_string('I', Math.floor(o % 5));
} else if ( o !== 9 ){
roman += 'IV';
} else {
roman += 'IX';
}
return roman;
}
var n = parseInt($('#number').val(), 10);
$('#pre0').text(roman_numeral(n));
pythonの場合。
sample.py
コード(BBEdit)
#!////usr////bin////env python3.3
# -*- coding: utf-8 -*-
def roman_numeral(n):
roman = 'M' * (n // 1000)
n %= 1000
h = n // 100
n %= 100
t = n // 10
o = n % 10
if h != 9 and h != 4:
roman += 'D' * (h // 5)
roman += 'C' * (h % 5)
elif h != 9:
roman += 'CD'
else:
roman += 'CM'
if t != 9 and h != 4:
roman += 'L' * (t // 5)
roman += 'X' * (t % 5)
elif t != 9:
roman += 'XL'
else:
roman += 'XC'
if o != 9 and o != 4:
roman += 'V' * (o // 5)
roman += 'I' * (o % 5)
elif o != 9:
roman += 'IV'
else:
roman += 'IX'
return roman
for n in [4,42,458,4569]:
print("{0}: {1}".format(n, roman_numeral(n)))
入出力結果(Terminal)
$ ./sample.py 4: IV 42: XXXXII 458: CDXLVIII 4569: MMMMDLXIX $
perlの場合。
sample.pl
コード(BBEdit)
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.016;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use POSIX;
sub roman_numeral{
my $n = shift;
my $roman = 'M' x floor( $n / 1000 );
$n %= 1000;
my $h = floor($n / 100);
$n %= 100;
my $t = floor($n / 10);
my $o = $n % 10;
if ($h != 9 && $h != 4) {
$roman .= 'D' x floor($h / 5);
$roman .= 'C' x floor($h % 5);
} elsif ($h != 9){
$roman .= 'CD';
} else {
$roman .= 'CM';
}
if ($t != 9 && $t != 4) {
$roman .= 'L' x floor($t / 5);
$roman .= 'X' x floor($t % 5);
} elsif ($t != 9) {
$roman .= 'XL';
} else {
$roman .= 'XC';
}
if ($o != 9 && $o != 4) {
$roman .= 'V' x floor($o / 5);
$roman .= 'I' x floor($o % 5);
} elsif ($o != 9) {
$roman .= 'IV';
} else {
$roman .= 'IX';
}
$roman;
}
for(4, 42, 458, 4569){
print $_ . ": " . roman_numeral($_) . "\n";
}
入出力結果(Terminal)
$ ./sample.pl 4: IV 42: XLII 458: CDLVIII 4569: MMMMDLXIX $
0 コメント:
コメントを投稿