72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
|
def reverse_roman(roman_string):
|
||
|
mille = ['', 'M', 'MM', 'MMM']
|
||
|
centaine = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM']
|
||
|
dixaine = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC']
|
||
|
unite = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']
|
||
|
number = 0
|
||
|
roman_string_length = len(roman_string)
|
||
|
index = 0
|
||
|
while True:
|
||
|
letter = roman_string[index]
|
||
|
current_number = letter
|
||
|
is_multiple = False
|
||
|
if current_number in mille:
|
||
|
while current_number in mille and index < roman_string_length - 1:
|
||
|
index += 1
|
||
|
current_number += roman_string[index]
|
||
|
if current_number not in mille:
|
||
|
is_multiple = True
|
||
|
current_number = current_number[0:-1]
|
||
|
number += (mille.index(current_number) * 1000)
|
||
|
elif current_number in centaine:
|
||
|
while current_number in centaine and index < roman_string_length - 1:
|
||
|
index += 1
|
||
|
current_number += roman_string[index]
|
||
|
if current_number not in centaine:
|
||
|
is_multiple = True
|
||
|
current_number = current_number[0:-1]
|
||
|
number += 100 * (centaine.index(current_number))
|
||
|
elif current_number in dixaine:
|
||
|
while current_number in dixaine and index < roman_string_length - 1:
|
||
|
index += 1
|
||
|
current_number += roman_string[index]
|
||
|
if current_number not in dixaine:
|
||
|
is_multiple = True
|
||
|
current_number = current_number[0:-1]
|
||
|
number += 10 * (dixaine.index(current_number))
|
||
|
elif current_number in unite:
|
||
|
while current_number in unite and index < roman_string_length - 1:
|
||
|
index += 1
|
||
|
current_number += roman_string[index]
|
||
|
if current_number not in unite:
|
||
|
is_multiple = True
|
||
|
current_number = current_number[0:-1]
|
||
|
number += unite.index(current_number)
|
||
|
|
||
|
if index == roman_string_length - 1:
|
||
|
if is_multiple:
|
||
|
letter = roman_string[index]
|
||
|
if letter in mille:
|
||
|
number += (mille.index(letter)) * 1000
|
||
|
elif letter in centaine:
|
||
|
number += 100 * (centaine.index(letter))
|
||
|
elif letter in dixaine:
|
||
|
number += 10 * (dixaine.index(letter))
|
||
|
elif letter in unite:
|
||
|
number += unite.index(letter)
|
||
|
break
|
||
|
|
||
|
return number
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||
|
assert reverse_roman('VI') == 6, '6'
|
||
|
assert reverse_roman('LXXVI') == 76, '76'
|
||
|
assert reverse_roman('CDXCIX') == 499, '499'
|
||
|
assert reverse_roman('MMMDCCCLXXXVIII') == 3888, '3888'
|
||
|
assert reverse_roman("I") == 1, '1'
|
||
|
assert reverse_roman("X") == 10, '10'
|
||
|
assert reverse_roman("MMMDCCCX") == 3810, '3810'
|
||
|
print('Great! It is time to Check your code!')
|