Задание 12 ЕГЭ по информатике на Python: исполнитель Редактор

опубликовано
читать
≈ 3 мин
автор
среда и версия
Python 3.14.2 в браузере (Pyodide 314.0.3) — там же, где запускаются примеры на странице; вывод совпал с CPython 3.14.7
содержание решать задачи Python для начинающих

В задании 12 ЕГЭ по информатике исполнитель Редактор меняет строку по программе: ищет в ней цепочку символов и заменяет её первое вхождение, пока выполняется условие цикла. Спрашивают, какая строка получится в конце, или наоборот — с какой строки нужно начать. Руками десятки замен легко спутать, а на Python программа Редактора переписывается почти дословно. Примеры ниже запускаются прямо на странице и составлены для этой статьи: на экзамене цепочки и числа будут другими, а шаблон — тот же.

ЕГЭ / 01

Команды Редактора на языке Python

Команды Редактора на языке PythonКак переписать программу Редактора на Python. нашлось (999) — это '999' in s. заменить (999, 3) — это s = s.replace('999', '3', 1): единица значит, что заменяется только первое вхождение. ПОКА — цикл while. ЕСЛИ … ТО … ИНАЧЕ — if и else. ИЛИ, И, НЕ — or, and, not. Строка из 70 цифр 9 — это '9' * 70.в заданиив Pythonнашлось (999)'999' in sзаменить (999, 3)s = s.replace('999', '3', 1)1 — заменить только первое вхождение слеваПОКА … КОНЕЦ ПОКАwhile …:ЕСЛИ … ТО … ИНАЧЕ …if …: … else: …ИЛИ, И, НЕor, and, notстрока из 70 цифр 9s = '9' * 70
Программа Редактора переписывается построчно. Главное — третий аргумент 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: там можно печатать строку на каждом шаге, как в проверке выше, и пройти цикл пошагово.

Источники