Перевод римских и арабских чисел в 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
5 февраля 2023, 15:46   Python   программирование