№24 · решено
Корректная римская запись
Текстовый файл. Файл из римских цифр I V X L C D M. Найди максимальную по длине подпоследовательность, которая является корректной римской записью десятичного числа; если таких несколько, выбери ту, что обозначает наименьшее число. В ответе — это число.
Источник: ФИПИ, № 31160
Скачать файл: task_31160_A.txt. В редакторе он уже лежит рядом с кодом, открывай как на экзамене: open('task_31160_A.txt').
Ответвпиши то, что вывела программа
Показать разбор
- Опиши корректное римское число регуляркой по разрядам: тысячи, сотни, десятки, единицы. В каждом разряде свои варианты, например CM, CD или D с тремя C.
- Совпадения могут перекрываться, поэтому ищи через заглядывание вперёд (?=...): так проверится каждая стартовая позиция.
- Найди наибольшую длину и собери все записи такой длины.
- Переведи их в десятичные числа и выведи наименьшее.
from re import finditer
s = open('task_31160_A.txt').readline().strip()
r = r'(?=(M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})))'
mx = 0
best = set()
for x in finditer(r, s):
c = x.group(1)
if len(c) > mx:
mx = len(c)
best = {c}
elif len(c) == mx:
best.add(c)
def value(c):
d = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
t = 0
for i in range(len(c)):
if i + 1 < len(c) and d[c[i]] < d[c[i + 1]]:
t -= d[c[i]]
else:
t += d[c[i]]
return t
print(min(value(c) for c in best))