ЕГЭ, вопрос 24 · Сложный пример: серия замен для валидации выражения. Нажимайте «Шаг», чтобы увидеть каждую замену.
01 Задача
Файл содержит цифры 0, 6, 7, 8, 9 и знаки - и *. Найти самое длинное корректное арифметическое выражение.
Корректное выражение — это:
✅ Разрешено
Числа из цифр: 96, 0, 700
Знаки между числами: 96*7-80
Ноль как отдельное число: 0*8
❌ Запрещено
Два знака подряд: 9**8, 6-*7
Ведущие нули: 06, 007
Знак на краю: *96, 8-
02 Стратегия замен
Идея: серией замен превращаем строку так, чтобы «плохие» места стали пробелами. Тогда split() разобьёт строку на корректные куски, и останется найти максимальный.
| Шаг |
Замена |
Зачем |
| 1 |
' ' + s + ' ' |
Пробелы-«часовые» по краям — упрощают обработку знаков на краях |
| 2 |
6,7,8,9 → '1' |
Унификация: нас интересует только «ноль / не ноль» |
| 3 |
'-' → '*' |
Унификация: оба знака — «операция» |
| 4 |
'**' → ' ' |
Два знака подряд → разрыв |
| 5 |
' *' → ' ' |
Знак после пробела (в начале выражения) → разрыв |
| 6 |
'* ' → ' ' |
Знак перед пробелом (в конце выражения) → разрыв |
| 7 |
'*00' → '*0 0' |
Ведущий ноль после знака: 8*007 → разрыв |
| 8 |
'*01' → '*0 1' |
Ведущий ноль после знака: 8*06 → разрыв |
| 9 |
' 00' → ' 0' (цикл) |
Убираем ведущие нули в начале числа: 007 → 7 |
| 10 |
' 01' → ' 1' |
Последний незначащий ноль в начале |
03 Код
s = ' ' + s + ' ' # пробелы по краям
for c in "6789":
s = s.replace(c, '1') # ненулевые цифры → '1'
s = s.replace('-', '*') # минус → умножение
s = s.replace("**", ' ') # два знака → разрыв
s = s.replace(" *", ' ') # знак после пробела → разрыв
s = s.replace("* ", ' ') # знак перед пробелом → разрыв
s = s.replace("*00", "*0 0") # ведущий ноль
s = s.replace("*01", "*0 1") # ведущий ноль
while " 00" in s:
s = s.replace(" 00", " 0") # убираем ведущие нули
s = s.replace(" 01", " 1") # последний ноль
print(len(max(s.split(), key=len)))
⚠️ Порядок замен важен! Сначала убираем «грубые» ошибки (двойные знаки, знаки на краях), потом — более тонкие (ведущие нули). Если поменять порядок, результат будет неправильным.
04 Интерактивный разбор
Введите строку из цифр 0, 6, 7, 8, 9 и знаков -, * — и нажимайте «Шаг», чтобы увидеть каждую замену.
Попробуй · пошаговый разбор
Нажми «Шаг» или «Запустить»
05 Тесты
💡 СоветСкопируйте любую строку в поле ввода интерактивного разбора выше и посмотрите пошагово, как алгоритм с ней работает.
Попробуй · тестирование
90*8*007-60*0*96 микс Ответ: ?
*96-70* знаки на краях Ответ: ?
8**7--6*0 двойные знаки Ответ: ?
00097*68-009 ведущие нули Ответ: ?
0*0*0 нули-числа Ответ: ?
006*70-009 ведущие нули Ответ: ?
7 одна цифра Ответ: ?
💡 Нажмите на строку теста — она автоматически подставится в интерактивный разбор
06 Когда использовать?
✅ Подходит
Поиск/удаление запрещённых комбинаций
«Правильные» подстроки из повторяющихся паттернов
Условие выражается через серию замен
💡 Совет
Метод очень мощный и компактный.
Главное — аккуратно продумать порядок замен!
Тестируйте на крайних случаях: 0*0, **, 007
Шпаргалка
| Приём |
Что делает |
' ' + s + ' ' |
Пробелы-часовые: знак на краю станет «знак рядом с пробелом» → легко удалить |
6789 → '1' |
Унификация цифр: важно лишь «ноль или не ноль» |
'-' → '*' |
Унификация знаков: оба — операции |
'**' → ' ' |
Два знака подряд → разрыв |
' *' и '* ' → ' ' |
Знак на краю выражения → разрыв |
'*00', '*01' → разрыв |
Ведущий ноль после знака |
while ' 00' |
Цикл: убираем все ведущие нули в начале числа |
max(s.split(), key=len) |
Финал: самая длинная корректная часть |