はじめに
本稿はマルチスケールシミュレーションという講義の最終課題についての記事です
目次
課題内容
(Rubyを用いて)アラビア数字(arabic numerals)を受け取り,ローマ数字(roman numerals)を返すmethodを書きなさい
課題解答
つまり、以下の表の左を入力とした時、右が出てくるようにしなさいよ。ということ。。。
アラビア数字 | ローマ数字 |
---|---|
1 | Ⅰ |
4 | Ⅳ |
16 | XVI |
むずそう。というかどういう規則で書かれてんねんこれ、、、
というわけで調べてみます。
ローマ数字
ローマ数字(Roman Numeral)には多少のバリエーションがありますが、一般的には下記の基本規則によって表現します。
I (1)、V (5)、X (10)、L (50)、C (100)、D (500)、M (1,000)という記号(i、v、x、l、c、d、mのように、小文字も可)を使用する。上記以外の数字は、これらの記号を組み合わせ、数を加算して得られる数字で表わす。例:II (1+1=2)、VI (5+1=6)ただし、4と9およびそれらの10n倍の数字は、右の数から左の数を減算して表わす。例:IV (5-1=4)、IX (10-1=9)、XL (50-10=40)、XC (100-10=90)
引用:ローマ数字
なるほど。。。
いかに実際に作ったコードを記載する。
class Roman
attr_accessor :num
def initialize(num=999)
@num = num
end
def to_roman
i = 0
s = ""
old = @num
intn = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
romn = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
while @num!=0 do
while @num/intn[i]>0 do
s = s + romn[i]
@num = @num - intn[i]
end
i += 1
end
puts old.to_s + " = " + s
end
end
greeter = Roman.new()
greeter.num = ARGV[0].to_i
greeter.to_roman
クラス化もしたことで、コードも簡潔で、割とまとまったプログラムが書けたと思います。。。
ただ、900や40などを"CM", "XL"と登録するのは我ながらズルしている感じがします。(苦笑)
以下に出力結果を載せます。
$ ruby roman_numerals.rb 999
999 = CMXCIX
$ ruby roman_numerals.rb 1997
1997 = MCMXCVII
参考
以下のサイトを参考にしました。
- source ~/grad_members_20f/members/Rooter-edi/qiita/roman_number.org