Текстовый файл состоит не более чем из 106 символов и содержит только цифры 0, 6, 7, 8, 9, а также знаки «-» и «*» (вычитание и умножение).
Определите максимальное количество символов в непрерывной последовательности, являющейся корректным арифметическим выражением с целыми неотрицательными числами (без знака).
В этом выражении никакие два знака арифметических операций не стоят рядом.
В записи чисел отсутствуют незначащие (ведущие) нули и число 0 не имеет знака.
В ответе укажите количество символов в найденном выражении.
Для выполнения этого задания следует написать программу.
Решение
Regexp
🔹 Шаг 1. Импортируем finditer и читаем файл в строку.
from re import finditer
s = open("24-1.txt").read()
📌 Импортируем finditer и читаем файл в строку.
🔹 Шаг 2. Задаём шаблон числа: либо одиночный ноль, либо цифра от 6 до 9 и…
num = r"([6789][06789]*|0)"
📌 Задаём шаблон числа: либо одиночный ноль, либо цифра от 6 до 9 и дальше любые цифры 0, 6–9 — без лишних ведущих нулей.
🔹 Шаг 3. Собираем регулярное выражение для корректного выражения
reg = rf"{num}([-*]{num})+"
📌 Собираем регулярное выражение для корректного выражения: число, затем один или несколько фрагментов «операция минус или умножение плюс число».
🔹 Шаг 4. Ищем все совпадения finditer и выбираем самое длинное по числу символов.
mx = max((x.group() for x in finditer(reg, s)), key=len, default="")
📌 Ищем все совпадения finditer и выбираем самое длинное по числу символов.
🔹 Шаг 5. Жми RUN
print(len(mx))
📌 Жми RUN — в выводе будет 154 (максимальная длина корректного арифметического выражения).
✅ Ответ: 154
🔹 Полный код
from re import finditer
s = open("24-1.txt").read()
num = r"([6789][06789]*|0)"
reg = rf"{num}([-*]{num})+"
mx = max((x.group() for x in finditer(reg, s)), key=len, default="")
print(len(mx))