Write a method that takes arabic numerals and returns roman numerals. (Issues in https://qiita.com/daddygongon/items/2d0a73a51ddab2d9da1b)
For the time being, I will paste the code I wrote this time before the explanation.
def to_roman (arabic_numerals)
pair_arabic_roman = [[1,"I"],[4,"IV"],[5,"V"],[9,"IX"],[10,"X"],[40,"XL"],[50,"L"],
[90,"XC"],[100,"C"],[400,"CD"],[500,"D"],[900,"CM"],[1000,"M"]]
roman_numerals = ""
pair_arabic_roman.reverse_each do |p_a, p_r|
while arabic_numerals >= p_a do
arabic_numerals = arabic_numerals - p_a
roman_numerals = roman_numerals + p_r
end
end
return roman_numerals
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = ARGV[0].to_i
print "#{arabic_numerals}\t : #{to_roman(arabic_numerals)}\n"
end
(The version incorporated in Integer class is pasted at the end of the page)
First, organize the outline of the method to be created
-** Function name : Anything is fine (here, to \ _roman) - Input : Arabic numerals - Output **: Roman numerals
Let's make it now
If you write it as you like, it will be like this.
def to_roman (arabic_numerals)
if arabic_numerals==1
print "I\n"
else
print "hoge\n"
end
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = ARGV[0].to_i
print "#{arabic_numerals}\n"
to_roman(arabic_numerals)
end
Of course it runs.
By the way, it is somehow outputting " hoge "
when it is other than 1.
When I wrote it obediently, it became like this.
def to_roman (arabic_numerals)
if arabic_numerals==1
print "I\n"
elsif arabic_numerals==2
print "II\n"
elsif arabic_numerals==4
print "IV\n"
else
print "hoge\n"
end
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = ARGV[0].to_i
print "#{arabic_numerals}\n"
to_roman(arabic_numerals)
end
Of course it runs.
elsif
I got tired of writing, so I wrote it in a loop.
Also, instead of outputting in the function, the return value is returned.
def to_roman (arabic_numerals)
pair_arabic_roman = [[1,"I"],
[2,"II"],
[4,"IV"],
[5,"V"]]
pair_arabic_roman.each do |arabic, roman|
if arabic_numerals==arabic
return roman
end
end
return "hoge"
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = ARGV[0].to_i
print "#{arabic_numerals}\n"
print "#{to_roman(arabic_numerals)}\n"
end
Of course it runs.
It is too tedious to write all the correspondence between Arabic numerals and Roman numerals in the correspondence table pair_arabic_roman
.
So, like this.
def to_roman (arabic_numerals)
pair_arabic_roman = [[1,"I"],[2,"II"],[4,"IV"],[5,"V"],[6,"VI"],[9,"IX"],[10,"X"]]
roman_numerals = ""
pair_arabic_roman.reverse_each do |arabic, roman| #Reverse each
if arabic_numerals >= arabic
arabic_numerals = arabic_numerals - arabic
roman_numerals = roman_numerals + roman
end
end
return roman_numerals
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = ARGV[0].to_i
print "#{arabic_numerals}\n"
print "#{to_roman(arabic_numerals)}\n"
end
Strategy to concatenate character strings steadily by setting the initial value of roman_numerals
to""
.
I referred to the string concatenation operation by seeing it written on this site (https://eigo.rumisunheart.com/2018/03/30/integer-to-roman-number-converter/).
-** For 3 : 3 = 2 + 1, so " "
becomes"II"
and then"III"
.
- For 8 **: 8 = 6 + 2, so " "
becomes"VI"
and then"VIII"
.
Improved if
to while
.
def to_roman (arabic_numerals)
pair_arabic_roman = [[1,"I"],[2,"II"],[4,"IV"],[5,"V"],[6,"VI"],[9,"IX"],[10,"X"]]
roman_numerals = ""
pair_arabic_roman.reverse_each do |p_a, p_r|
while arabic_numerals >= p_a do
arabic_numerals = arabic_numerals - p_a
roman_numerals = roman_numerals + p_r
end
end
return roman_numerals
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = Range.new(1,20)
arabic_numerals.each do |i|
print "#{i}\t : #{to_roman(i)}\n"
end
end
Almost completed when you come here.
By the way, Range
is often seen in python.
After organizing the correspondence table pair_arabic_roman
to some extent, it became like this.
def to_roman (arabic_numerals)
pair_arabic_roman = [[1,"I"],[4,"IV"],[5,"V"],[9,"IX"],[10,"X"],[40,"XL"],[50,"L"],
[90,"XC"],[100,"C"],[400,"CD"],[500,"D"],[900,"CM"],[1000,"M"]]
roman_numerals = ""
pair_arabic_roman.reverse_each do |p_a, p_r|
while arabic_numerals >= p_a do
arabic_numerals = arabic_numerals - p_a
roman_numerals = roman_numerals + p_r
end
end
return roman_numerals
end
if $PROGRAM_NAME == __FILE__
arabic_numerals = [51,97,99,439,483,499,500,732,961,999,1000,1999,2000]
arabic_numerals.each do |i|
print "#{i}\t : #{to_roman(i)}\n"
end
end
Of course I did it. I did it. With this feeling, the code listed at the beginning is completed.
Integer Integer class is extended to
999.to_roman #=> CMXCIX
To return.
I slammed the method I just created into an Integer class.
class Integer
def to_roman
arabic_numerals = self
pair_arabic_roman = [[1,"I"],[4,"IV"],[5,"V"],[9,"IX"],[10,"X"],[40,"XL"],[50,"L"],
[90,"XC"],[100,"C"],[400,"CD"],[500,"D"],[900,"CM"],[1000,"M"]]
roman_numerals = ""
pair_arabic_roman.reverse_each do |p_a, p_r|
while arabic_numerals >= p_a do
arabic_numerals = arabic_numerals - p_a
roman_numerals = roman_numerals + p_r
end
end
return roman_numerals
end
end
if $PROGRAM_NAME == __FILE__
a = ARGV[0].to_i
print "#{a}\t : #{a.to_roman}\n"
end
Of course, the output is as expected.
Recommended Posts