Информатика: ОГЭ и ЕГЭ

Тренировка ЕГЭ · задание 24 · римская запись числа

Задание 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)

Решить такую задачу — новый вариант с проверкой

Задание 24 ЕГЭ: другие виды

Все задачи задания 24 вперемешку · разбор: как решать задание 24 · пробные варианты ЕГЭ