В задании 12 ЕГЭ по информатике исполнитель Редактор меняет строку по программе: ищет в ней цепочку символов и заменяет её первое вхождение, пока выполняется условие цикла. Спрашивают, какая строка получится в конце, или наоборот — с какой строки нужно начать. Руками десятки замен легко спутать, а на Python программа Редактора переписывается почти дословно. Примеры ниже запускаются прямо на странице и составлены для этой статьи: на экзамене цепочки и числа будут другими, а шаблон — тот же.
Команды Редактора на языке Python
replace: без него Python заменит все вхождения сразу, а Редактор меняет только первое слева.Пример задачи
Редактор получает на вход строку из 70 цифр 9 и выполняет программу:
ПОКА нашлось (333) ИЛИ нашлось (999)
ЕСЛИ нашлось (999)
ТО заменить (999, 3)
ИНАЧЕ заменить (333, 9)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
Команда «заменить (v, w)» меняет первое слева вхождение цепочки v на цепочку w, «нашлось (v)» проверяет, есть ли v в строке. Какая строка получится в результате?
Решение
s = '9' * 70
while '333' in s or '999' in s:
if '999' in s:
s = s.replace('999', '3', 1)
else:
s = s.replace('333', '9', 1)
print(s)
9939
'9' * 70— строка из семидесяти девяток: умножение строки на число повторяет её.'999' in s— команда «нашлось»:True, если цепочка есть в строке.s.replace('999', '3', 1)— команда «заменить». Третий аргумент ограничивает замену первым вхождением слева, как у Редактора. Строки в Python не меняются на месте, поэтому результат записывают обратно вs.- Ветки идут в том же порядке, что в условии: сначала проверка 999, иначе — замена 333.
Ответ: 9939.
Проверка на короткой строке
Перевод программы проверяют на строке, которую легко пройти руками. Семь девяток: первые три становятся тройкой — 39999, затем снова три девятки — 339, а ни 999, ни 333 в строке больше нет. Программа с печатью на каждом шаге должна показать то же:
s = '9' * 7
print(s)
while '333' in s or '999' in s:
if '999' in s:
s = s.replace('999', '3', 1)
else:
s = s.replace('333', '9', 1)
print(s)
9999999
39999
339
Каждая строка вывода — один шаг цикла, и шаги совпали с разбором руками. Значит, программа переписана верно, и её ответу для 70 девяток можно доверять.
Обратная задача: подобрать строку
Бывает и наоборот: на вход подаётся строка из n цифр 9, где n больше 50. При каком наименьшем n программа выдаст строку 39? Программу Редактора оборачивают в функцию и перебирают n:
def edit(s):
while '333' in s or '999' in s:
if '999' in s:
s = s.replace('999', '3', 1)
else:
s = s.replace('333', '9', 1)
return s
for n in range(51, 1000):
if edit('9' * n) == '39':
print(n, edit('9' * (n - 1)))
break
52 3
Перебор начинается с 51, потому что n больше 50, и останавливается на первом подходящем — наименьшем. Вторая цифра вывода — результат для соседнего n = 51: там получается 3, а не 39, так что ответ 52.
Частые ошибки
replace без третьего аргумента. Без единицы Python заменит все вхождения цепочки сразу, а не первое, и ответ уйдёт:
s = '9' * 70
while '333' in s or '999' in s:
if '999' in s:
s = s.replace('999', '3')
else:
s = s.replace('333', '9')
print(s)
339339
Ветки не в том порядке. Если сначала проверять 333, а потом 999, для 70 девяток выйдет 33 вместо 9939. Порядок проверок — часть программы, его переносят из условия как есть.
Результат замены не записан. s.replace('999', '3', 1) без s = возвращает новую строку и ничего не меняет в s: условие цикла остаётся истинным, и программа не закончится.
Какие ещё задания решают программой — в статье «Python для ЕГЭ по информатике», перебор слов из задания 8 — в статье «Задание 8 ЕГЭ на Python». Свой вариант удобно проверять в песочнице Python: там можно печатать строку на каждом шаге, как в проверке выше, и пройти цикл пошагово.