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:

  1. Replace factors with their numeric values

starting from subtractive factors (cause they are compound).

  1. 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