Перевод римских и арабских чисел в Python
Изучаю тут Питон. Решил зафиксировать для истории решение одной задачи с Хекслета.
Во-первых, оно нравится мне больше учительского (потому что рекурсия же). Во-вторых, у испытания самый низкий процент завершений, который я пока видел (хотя сейчас начало второго модуля, так что видел не много). В-третьих, интересно будет вернуться сюда через год и покекать над собой из прошлого. Ну, и, наконец, моё решение может пригодиться кому-то ещё, хотя бы в качестве антипримера.
NUMERALS = {
'M': 1000,
'CM': 900,
'D': 500,
'CD': 400,
'C': 100,
'XC': 90,
'L': 50,
'XL': 40,
'X': 10,
'IX': 9,
'V': 5,
'IV': 4,
'I': 1,
}
def descending(pair):
return -pair[1]
def to_roman(arabic_num):
roman_num = ''
for roman, digit in sorted(NUMERALS.items(), key=descending):
add = arabic_num // digit
roman_num += roman * add
arabic_num = arabic_num % digit
return roman_num
def get_digit(roman, digit, symbol, arabic):
if symbol == roman[:len(symbol)]:
return get_digit(roman[len(symbol):], digit, symbol, arabic + digit)
return roman, arabic
def to_arabic(roman_num):
number = roman_num
arabic_num = 0
for symbol, digit in sorted(NUMERALS.items(), key=descending):
number, arabic_num = get_digit(number, digit, symbol, arabic_num)
if to_roman(arabic_num) == roman_num:
return arabic_num
return False