t_a_w

Roman Numerals Parser

Nov 3rd, 2016
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 0.96 KB | None | 0 0
  1. def parse_roman(roman)
  2.   roman_numerals = [ ['M', 1000], ['CM', 900], ['D', 500], ['CD', 400], ['C', 100], ['XC', 90],
  3.             ['L', 50], ['XL', 40], ['X', 10], ['IX', 9], ['V', 5], ['IV', 4], ['I', 1] ]
  4.   roman = roman.upcase
  5.   result = 0
  6.   roman_numerals.each do |sym, val|
  7.     while roman.sub!(/^#{sym}/, "")
  8.       result += val
  9.     end
  10.   end
  11.   result
  12. end
  13.  
  14. # "CM" = 900, which we get by "M" (1000) + "C" (100) + "CM" (-200)
  15. # much easier code than otherwise
  16. def parse_roman_2(roman)
  17.   roman_numerals = [
  18.             ['M', 1000], ['CM', -200],
  19.             ['D', 500], ['CD', -200],
  20.             ['C', 100], ['XC', -20],
  21.             ['L', 50], ['XL', -20],
  22.             ['X', 10], ['IX', -2],
  23.             ['V', 5], ['IV', -2],
  24.             ['I', 1]
  25.   ]
  26.   roman = roman.upcase
  27.   roman_numerals.map{|sym, val| val * roman.scan(sym).size}.inject(0, &:+)
  28. end
  29.  
  30. ["MCMXC", "MMVIII", "MDCLXVI"].each {|r| puts "%8s :%5d  :%5d " % [r, parse_roman(r), parse_roman_2(r)]}
Advertisement
Add Comment
Please, Sign In to add comment