I am new to Ruby and I am trying to write a program which convert Roman numerals to numbers.
This is what I did so far:
roman_numbers = {"M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1}
number_by_user = "MCMXCIX"
singlenum = number_by_user.split(//).reverse!
l = singlenum.length
result =0
result = roman_numbers[singlenum[0]]
puts result
for i in 0..l-1
if roman_numbers.key?(singlenum[i])
**if (roman_numbers[singlenum[i]] > roman_numbers[singlenum[i+1]])** #gives error
result = result - roman_numbers[singlenum[i+1]]
elsif (roman_numbers[singlenum[i]]== roman_numbers[singlenum[i+1]] || **roman_numbers[singlenum[i]] < roman_numbers[singlenum[i+1]])** #gives error
result = result + roman_numbers[singlenum[i+1]]
end
puts roman_numbers[singlenum[i]]
else
puts "One of the values are not roman"
break
end
end
puts "The number is: " , result
but it gives me the following error (see the line with comment):
:in `>': comparison of Fixnum with nil failed (ArgumentError)
You have an off-by-one error. Arrays are 0 indexed. Your
singlenum.lengthin this case is 7, but in your for loop, you go up to 6, then try to referencesinglenum[7]to compare tosinglenum[6].singlenum[7]isnil, so it doesn’t understand the < operator.