Skip to content

Instantly share code, notes, and snippets.

@wlodi83
Created December 2, 2012 15:28
Show Gist options
  • Save wlodi83/4189323 to your computer and use it in GitHub Desktop.
Save wlodi83/4189323 to your computer and use it in GitHub Desktop.
RUBY QUIZ: roman numerals
class Converter
ROMANS = {'M' => 1000, 'D' => 500, 'C' => 100, 'L' => 50, 'X' => 10, 'V' => 5, 'I' => 1}
def is_roman?(line)
line = /[MDCLXVI]+/
end
def is_arabic?(line)
line = /^(?:[123]\d{3}|[1-9]\d{0,2})$/
end
def enter(number, one, five, ten)
t = String.new
if number < 4 then (1..number).each {t += one}
elsif number == 4 then t = one + five
elsif number == 5 then t = five
elsif (number > 5) && (number < 9) then t = five; (1..number-5).each {t += one}
elsif number == 9 then t = one + ten
end
return t
end
def to_roman(number)
roman = String.new
(1..number/1000).each {roman += 'M'}; number %= 1000 if number/1000 > 0
roman += enter(number/100, 'C', 'D', 'M'); number %= 100 if number/100 >0
roman += enter(number/10, 'X', 'L', 'C'); number %= 10 if number/10 > 0
roman += enter(number, 'I', 'V', 'X') if number > 0
end
def to_arabic(roman)
sum = 0
temp = false
(0...roman.length).each do |i|
add = min = 0
if temp == false
add = ROMANS[roman[i]]
min = ROMANS[roman[i+1]] if !roman[i+1].nil?
if add < min
add = min - add
temp = true
end
sum += add
else
temp = false
end
end
return sum
end
end
co = Converter.new
if __FILE__ == $0
ARGF.each_line do |line|
line.chomp!
case line
when co.is_arabic?(line) then puts co.to_roman(line.to_i)
when co.is_roman?(line) then puts co.to_arabic(line)
else raise "Wrong input: #{line}"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment