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