Python на ЕГЭ: практические примеры и разбор задач
Разбор типового задания ЕГЭ на Python (исполнитель Редактор)
Как написать программу для исполнителя Редактор с помощью цикла while?
Основное решение использует цикл, который проверяет наличие подстроки и выполняет замену в соответствии с условиями. Эффективность достигается за счет прямого использования строковых операций и логики, аналогичной исполнителю.
def apply_editor(s):
while '111' in s or '222' in s:
if '111' in s:
s = s.replace('111', '2', 1)
else:
s = s.replace('222', '1', 1)
return s
# Пример для N = 7
initial = '1' * 7
result = apply_editor(initial)
print(result) # ожидаемый вывод
яндекс задания python (задания от яндекса по python)
Здесь replace с третьим аргументом 1 заменяет только первое вхождение. Цикл продолжается, пока есть подстроки '111' или '222'. Такой подход точно повторяет алгоритм Редактора.
Типичные ошибки:
- Замена всех вхождений сразу (без аргумента 1) может привести к неверному результату, так как исполнитель заменяет только одну подстроку за шаг.
- Неправильный порядок проверки условий: если менять '111' и '222' одновременно, нужно следовать логике "если нашлось ... то заменить".
- Бесконечный цикл, если строки зацикливаются (например, '111' -> '2', но '2' не участвует в дальнейшей замене, но если есть другая пара).
Цель этого варианта - точная симуляция поведения исполнителя для любого входного состояния.
Как использовать метод replace с заменой по шаблону?
В некоторых задачах можно обойтись без цикла, если шаблон однозначен. Например, если замена выполняется всегда в одном порядке и результат предсказуем. Однако для общего случая цикл обязателен. Здесь показан альтернативный компактный вариант с использованием вложенных замен, но он не всегда корректен.
def apply_compact(s):
while '111' in s:
s = s.replace('111', '2', 1)
if '222' in s:
s = s.replace('222', '1', 1)
return s
Python разработчик тестовые задания (примеры тестовых заданий python)
В этом варианте после каждой замены '111' сразу проверяется наличие '222' - это может нарушить порядок, если исполнитель сначала проверяет '111', а затем '222' только после отсутствия первого. Данный код не эквивалентен оригинальному алгоритму.
Проблема:
В оригинальном исполнителе проверка '111' и '222' идет на каждом шаге цикла, и если нашлось '111', то заменяется, иначе проверяется '222'. В приведенном коде после замены '111' сразу заменяется '222' (если есть), что может быть неверно. Использовать такой подход можно только при уверенности, что порядок не важен.
Этот вариант подходит для случаев, когда замены не пересекаются или когда задание явно требует одновременной замены.
Как реализовать исполнителя с помощью рекурсии?
Рекурсивный подход имитирует пошаговое выполнение команд. Функция вызывает себя до тех пор, пока в строке есть изменения.
def editor_rec(s):
if '111' in s:
return editor_rec(s.replace('111', '2', 1))
elif '222' in s:
return editor_rec(s.replace('222', '1', 1))
else:
return s
егэ python задачи (задачи егэ по python)
Рекурсия делает код более декларативным, но может привести к переполнению стека при большом количестве шагов. Для задач ЕГЭ количество итераций обычно невелико, поэтому вариант допустим.
Риски:
- Глубина рекурсии ограничена (обычно 1000 по умолчанию). Если строка длинная и требует много замен, может возникнуть RecursionError.
- Сложность отладки при ошибочных условиях.
Цель - наглядное представление алгоритма. Подходит для обучения рекурсии.
Как применить регулярные выражения для поиска и замены?
Модуль re позволяет выполнять замену по шаблону. Однако в классическом исполнителе замена происходит только один раз за шаг, а не по всем совпадениям. Регулярный подход полезен, если нужно заменить все вхождения сразу (например, в некоторых модификациях задачи).
import re
def editor_re(s):
while re.search('111', s) or re.search('222', s):
if re.search('111', s):
s = re.sub('111', '2', s, count=1)
else:
s = re.sub('222', '1', s, count=1)
return s
Это практически то же самое, что и базовое решение, но с использованием re.sub. Может быть удобно, если шаблоны сложнее (например, с повторениями).
Недостаток:
Импорт дополнительного модуля может замедлить выполнение, хотя для ЕГЭ это не критично.
Цель - показать гибкость при работе с более сложными условиями замен.
Расширенные примеры для задания 12
Ниже приведены примеры, демонстрирующие нестандартные подходы и анализ задач.
Пример 1: Подсчет количества замен
Требуется не только получить итоговую строку, но и подсчитать, сколько раз была выполнена каждая замена. Для этого в базовое решение добавляются счетчики.
def apply_with_count(s):
cnt1 = 0
cnt2 = 0
while '111' in s or '222' in s:
if '111' in s:
s = s.replace('111', '2', 1)
cnt1 += 1
else:
s = s.replace('222', '1', 1)
cnt2 += 1
return s, cnt1, cnt2
# Пример для N=5
result, c1, c2 = apply_with_count('11111')
print('Результат:', result) # ожидаем, например, '221'
print('Замен 111->2:', c1)
print('Замен 222->1:', c2)
Результат: 221 Замен 111->2: 2 Замен 222->1: 1
Такой анализ полезен для понимания динамики процесса.
Пример 2: Работа с разными начальными символами
Пусть начальная строка содержит не только единицы, но и другие цифры, например, '111222111'. Алгоритм остается тем же, но требуется аккуратное обращение с порядком.
def editor_mixed(s):
while '111' in s or '222' in s:
if '111' in s:
s = s.replace('111', '2', 1)
elif '222' in s:
s = s.replace('222', '1', 1)
return s
print(editor_mixed('111222111'))
21
Пояснение: сначала заменилось '111' в начале, затем '222', затем оставшееся '111' - итог '21'.
Пример 3: Перебор N для поиска минимального N, дающего заданный результат
Часто требуется найти начальное количество единиц, при котором итоговая строка равна определенному значению. Полная симуляция для разных N с остановкой по условию - надежный метод.
def find_min_N(target):
for N in range(1, 100):
s = '1' * N
res = apply_editor(s)
if res == target:
return N
return None
print(find_min_N('12'))
6
Этот подход автоматизирует поиск, избегая ручных расчетов.