module CousinRoman::Roman
Public Instance Methods
convert(number)
click to toggle source
Convert Roman
number
represented as a string to an Integer
.
It is essential that numer
is a valid Roman
numeral.
The steps are:
-
Replace factors with their numeric values
starting from subtractive factors (cause they are compound).
-
Sum this numeric values to get the final answer
# File lib/cousin_roman/roman.rb, line 19 def convert(number) intermediate = number.dup.downcase compound = braketize_value_of SUBTRACTIVES singular = braketize_value_of ONES.merge(FIVES) [compound, singular].each { |factors| factors.each { |literal, val| intermediate.gsub!(literal, val) } } intermediate.scan(/\((\d*)\)/).reduce(0) do |sum, term| sum + term.first.to_i end end
roman_regex()
click to toggle source
# File lib/cousin_roman/roman.rb, line 42 def roman_regex /^(M{0,3})(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i end
to_arabian(number)
click to toggle source
# File lib/cousin_roman/roman.rb, line 31 def to_arabian(number) clean = number.strip convert clean if valid? clean end
to_arabian!(number)
click to toggle source
# File lib/cousin_roman/roman.rb, line 36 def to_arabian!(number) clean = number.strip valid? clean or raise TypeError, 'not a valid roman number' convert clean end
valid?(number)
click to toggle source
# File lib/cousin_roman/roman.rb, line 5 def valid?(number) matches = number.match roman_regex matches and !matches[0].empty? end
Private Instance Methods
braketize_value_of(factors)
click to toggle source
Make hash of the following structure {‘i’ => ‘(1)’, ‘v’ => ‘(5)’…}
# File lib/cousin_roman/roman.rb, line 49 def braketize_value_of(factors) Hash[factors.map { |literal, val| [literal, "(#{val})"] } ] end