Задание 24 ЕГЭ: римская запись числа
Римская запись числа в строке. Тема номера — обработка символьных строк. Ниже — пример с ответом и решением; кнопкой под ним можно решить такую же задачу с другими числами, ответ проверится сразу.
Пример
Задание выполняется с использованием прилагаемого файла.
Текстовый файл 24.txt содержит строку из заглавных латинских букв, всего не более 30 000 символов. Среди них встречаются символы римской записи чисел I, V, X, L, C, D, M.
Определите наибольшее натуральное число, правильная римская запись которого встречается в строке как фрагмент из идущих подряд символов. В ответе запишите это число в десятичной системе счисления.
Правильная римская запись: от 1 до 3999, тысячи — M, MM или MMM; затем сотни, десятки и единицы, каждый разряд записан как в обычной записи (например, CM = 900, XL = 40, IV = 4); один символ не повторяется больше трёх раз подряд.
Для выполнения этого задания следует написать программу.
Ответ
3836Решение
Римская запись числа до 3999 не длиннее 15 символов (MMMDCCCLXXXVIII), поэтому достаточно проверить все фрагменты длиной до 15 регулярным выражением правильной записи и взять наибольшее значение.
Ответ: 3836.
import re
rx = re.compile(r'M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})')
val = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
def value(t):
total = 0
for a, b in zip(t, t[1:] + ' '):
total += -val[a] if b != ' ' and val[b] > val[a] else val[a]
return total
s = open('24.txt').read().strip()
best = 0
for i in range(len(s)):
for j in range(i + 1, min(len(s), i + 15) + 1): # самая длинная запись — 15 символов
if rx.fullmatch(s[i:j]):
best = max(best, value(s[i:j]))
print(best)