RodegastНу, вот в примере идут четыре единицы подряд.
надо предварительно сложить в stek-е идущие подряд числа
>>> a = "MCMLXXXVIII" >>> stek = [ ds[x] for x in a ] >>> reduce(lambda x, y: x - y if x > y else x + y, stek[::-1]) 1966 # Не правильно >>> stek [1000, 100, 1000, 50, 10, 10, 10, 5, 1, 1, 1] >>> stek = [1000, 100, 1000, 50, 30, 5, 3] >>> reduce(lambda x, y: x - y if x > y else x + y, stek[::-1]) 1988 # Правильно
RodegastДа, ошибка там.
Ну значит в примере ошибка.
CONV_TABLE = ((1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')) def roman_to_arab(txt): txt = txt.upper() ret = 0 for arab, roman in CONV_TABLE: while txt.startswith(roman): ret += arab txt = txt[len(roman):] return ret a = 'MCMLXXXVIII' print(roman_to_arab(a))
>>> roman_to_arab("VM") 5 # Должно быть 995
py.user.next
Сначала выясняешь длину, а потом читаешь по два символа.
При этом второй не должен выйти за край строки (проверка по вычисленной длине).
num = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} total = 0 a = input() a.upper() for i in a: for j in range(a.index(i)+1, len(a)): if num.get(i) < num.get(a[j]): total -= num.get(i) break else: total += num.get(i) print(total)