Алгоритмы
Задание 12 ЕГЭ по информатике: исполнитель Редактор — разбор и примеры
В задании 12 исполнитель Редактор получает на вход строку из цифр и по программе с циклом ПОКА многократно заменяет в ней одни фрагменты другими. Нужно определить, какая строка получится в конце, найти сумму её цифр или, наоборот, подобрать входную строку с заданным результатом. Задачу можно решать вручную, отслеживая закономерность, но на компьютерном экзамене надёжнее всего смоделировать работу Редактора программой на Python — это несколько строк кода.
Что проверяет задание
- умение исполнять алгоритм с циклом и ветвлениями;
- точное понимание команд исполнителя:
заменить(v, w)заменяет первое слева вхождение v на w,нашлось(v)проверяет, есть ли v в строке; - умение замечать периодичность: часто за несколько итераций строка возвращается к похожему виду, только короче;
- для обратных задач — умение организовать перебор входных данных.
Команды Редактора
заменить(v, w)— первое слева вхождение цепочки v заменяется на цепочку w; если v нет, строка не меняется;нашлось(v)— условие, истинное, если цепочка v встречается в строке;ПОКА условие … КОНЕЦ ПОКА— тело повторяется, пока условие истинно;ЕСЛИ условие ТО … ИНАЧЕ … КОНЕЦ ЕСЛИ— ветвление.
В Python команде заменить(v, w) соответствует s = s.replace(v, w, 1) — третий аргумент 1 ограничивает замену первым вхождением. Без него replace заменит все вхождения сразу, и результат будет другим.
Типичные формулировки
- «На вход подаётся строка из цифры 1 и n идущих подряд цифр 8. Какая строка получится при n = 75?»
- «Какова сумма цифр строки, получившейся в результате?»
- «Найдите наименьшее n, большее 100, при котором результат работы программы содержит ровно две цифры 2».
- «Строка состоит из цифр 1, 2 и 3 в некотором количестве; известно количество каждой цифры в итоговой строке, найдите длину исходной».
Пошаговый метод
- Перепишите программу на Python:
whileс условиямиin, внутри —if/elifтак же, как в условии. Особенно внимательно проверьте, ЕСЛИ-блоки идут подряд (каждый проверяется) или через ИНАЧЕ (выполняется только один). - Сформируйте входную строку из условия, например
'1' + '8' * n. - Запустите и получите результат. Если нужна сумма цифр —
sum(map(int, s)). - Для обратной задачи оберните моделирование в функцию и переберите n в цикле, пока не найдётся подходящее.
- Для самопроверки разберите вручную 2–3 итерации и найдите закономерность: сколько символов «съедает» один полный круг.
Разбор примера
Дана программа для Редактора:
ПОКА нашлось(18) ИЛИ нашлось(288) ИЛИ нашлось(3888)
ЕСЛИ нашлось(18) ТО заменить(18, 2) КОНЕЦ ЕСЛИ
ЕСЛИ нашлось(288) ТО заменить(288, 3) КОНЕЦ ЕСЛИ
ЕСЛИ нашлось(3888) ТО заменить(3888, 1) КОНЕЦ ЕСЛИ
КОНЕЦ ПОКАНа вход подаётся строка из цифры 1 и n цифр 8.
Вопрос 1. Какая строка получится при n = 75?
Анализ вручную. Первая цифра — «голова» строки — съедает восьмёрки справа: единица съедает одну 8 и превращается в 2, двойка съедает две 8 и становится 3, тройка съедает три 8 и снова становится 1. Значит, за один полный круг 1 → 2 → 3 → 1 исчезает 1 + 2 + 3 = 6 восьмёрок, и строка снова начинается с единицы.
75 = 6 × 12 + 3. После 12 полных кругов остаётся строка «1888». Дальше: 18 → 2, остаётся «288»; 288 → 3, остаётся «3». Ни одно условие цикла больше не выполняется. Ответ: 3.
Вопрос 2. Найдите наименьшее n > 100, при котором результат — строка «2».
Строка «2» получается, когда после полных кругов осталась ровно одна восьмёрка: единица съедает её и превращается в 2, а для тройки восьмёрок уже нет. То есть n при делении на 6 даёт остаток 1. Наименьшее такое n больше 100 — это 103 (102 делится на 6). Ответ: 103.
Для проверки полезно составить таблицу остатков: при остатке 0 результат «1», 1 — «2», 2 — «28», 3 — «3», 4 — «38», 5 — «388».
Код на Python
def run(s):
while '18' in s or '288' in s or '3888' in s:
if '18' in s:
s = s.replace('18', '2', 1)
if '288' in s:
s = s.replace('288', '3', 1)
if '3888' in s:
s = s.replace('3888', '1', 1)
return s
print(run('1' + '8' * 75)) # 3
n = 101
while run('1' + '8' * n) != '2':
n += 1
print(n) # 103Обратите внимание на структуру: три отдельных if, потому что в программе три отдельных ЕСЛИ без ИНАЧЕ. Если бы в программе было ЕСЛИ … ИНАЧЕ ЕСЛИ …, нужно было бы писать if … elif …. Эта разница меняет порядок замен и может изменить ответ.
Если строка очень длинная (десятки тысяч символов), моделирование всё равно работает быстро. Если же программа зацикливается, проверьте, правильно ли вы записали условия цикла: Редактор по условию задачи всегда завершает работу.
Обратные задачи
В обратных задачах известен результат, а нужно найти входные данные: наименьшее n, при котором сумма цифр результата равна заданному числу, или количество цифр каждого вида во входной строке. Схема всегда одна: функция run моделирует программу, а внешний цикл перебирает кандидатов. Если на вход подаётся строка из нескольких групп цифр (например, «1», затем a цифр 2, затем b цифр 3), переберите a и b двумя вложенными циклами в разумных пределах — обычно до 100–200.
Чтобы перебор не работал слишком долго, полезно сначала понять, сколько символов «съедает» один круг программы, — это сразу сужает диапазон. А для проверки найденного ответа запустите run ещё раз именно на нём и выведите итоговую строку: так вы убедитесь, что условие действительно выполнено.
Частые ошибки
- Используют
replaceбез третьего аргумента и заменяют все вхождения сразу. - Путают ЕСЛИ подряд и ЕСЛИ … ИНАЧЕ: в первом случае за одну итерацию может выполниться несколько замен.
- Ошибаются в условии цикла: ИЛИ вместо И или пропущенная цепочка.
- Неверно строят входную строку: «n цифр 8» — это
'8' * n, а не число 8n. - В обратной задаче начинают перебор не с того числа: «больше 100» значит, что 100 не подходит.
- Отвечают строкой вместо суммы цифр или наоборот — перечитайте вопрос.
Потренируйтесь
Моделируйте Редактор программой и проверяйте закономерность вручную: задания № 12 в банке. Чтобы отработать сам код, решите задачи с проверкой кода. Следующая тема — задание 13: исполнитель и количество программ.