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