LoginSignup
14
0

More than 3 years have passed since last update.

最終課題:RomanNumerals

Last updated at Posted at 2020-12-21

!macOS-11.0.1 !ruby-2.6.1p33

はじめに

本稿はマルチスケールシミュレーションという講義の最終課題についての記事です

目次

  1. 課題内容

  2. 課題解答

  3. 参考資料

課題内容

課題:roman numerals

(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)

引用:ローマ数字

なるほど。。。

いかに実際に作ったコードを記載する。

RomanNumerals.rb
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
14
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
0