#!/usr/bin/env ruby -w # # Time to party like it's roman_to_integer 'mcmxcix' # "Learn to Program" by Chris Pine, p. 113 def roman_to_integer s roman_values = { 'M' => 1000, 'D' => 500, 'C' => 100, 'L' => 50, 'X' => 10, 'V' => 5, 'I' => 1, } value = 0 (0..(s.length - 1)).each do |i| c = s[i].chr if i < s.length - 1 && roman_values[c] < roman_values[s[i + 1].chr] value = value - roman_values[c] else value = value + roman_values[c] end end return value end test_values = [ ['I', 1], ['II', 2], ['III', 3], ['IV', 4], ['V', 5], ['VI', 6], ['VII', 7], ['VIII', 8], ['IX', 9], ['X', 10], ['XI', 11], ['XII', 12], ['XIII', 13], ['XIV', 14], ['XV', 15], ['XVI', 16], ['XVII', 17], ['XVIII', 18], ['XIX', 19], ['XX', 20], ['XXX', 30], ['XL', 40], ['L', 50], ['LX', 60], ['LXX', 70], ['LXXX', 80], ['XC', 90], ['XCIX', 99], ['C', 100], ['CC', 200], ['CD', 400], ['D', 500], ['CM', 900], ['M', 1000], ['MIX', 1009], ['MCMXLV', 1945], ['MCMXCIX', 1999], ['MM', 2000], ['MMM', 3000], ] success = true test_values.each do |roman, arabic| test = roman_to_integer roman if test != arabic puts "ERROR: #{roman} is #{test}, should be #{arabic}" success = false end end exit unless success print "Roman number (or 'q' to quit): " s = gets.chomp.upcase while s != 'Q' puts "#{s}: #{roman_to_integer(s)}" print "Roman number (or 'q' to quit): " s = gets.chomp.upcase end