Задание 12 ЕГЭ: машина Тьюринга и исполнитель Редактор — гайд с примерами
Подтемы
- Машина Тьюринга20 задач
- Исполнитель Редактор60 задач
Что проверяет задание
Задание 12 проверяет умение формально выполнять алгоритм, заданный для абстрактного исполнителя, шаг за шагом, без ошибок в трактовке правил. В экзамене встречаются два основных исполнителя: машина Тьюринга (МТ) и исполнитель Редактор, работающий со строками символов. Задание проверяет не знание «хитрых» формул, а способность аккуратно смоделировать работу программы, увидеть закономерность в её поведении и применить эту закономерность к большим объёмам данных, которые невозможно протрассировать полностью вручную.
Как выглядит формулировка и сколько баллов
Задание находится в части 1, оценивается в 1 балл, ответ — целое число, калькулятор не нужен, но нужна аккуратность. Условие почти всегда содержит: полное описание правил исполнителя (алфавит, состояния, формат команды), иллюстративный пример работы программы на маленькой ленте или строке, и собственно вопрос: дана лента/строка большой длины (сотни-тысячи символов), известен результат после выполнения программы, требуется найти характеристику исходных данных — максимальное или минимальное количество символов определённого вида. Программа исполнителя из года в год похожа почти буквально, меняются только числа, поэтому важно один раз разобраться в логике конкретного шаблона.
Что нужно знать
Машина Тьюринга:
- Алфавит , где — пустой символ.
- Множество состояний , начальное состояние всегда .
- Команда в ячейке таблицы — тройка (записываемый символ; сдвиг ; новое состояние); команда с завершением помечается .
- Порядок символов в заголовке таблицы совпадает с порядком, в котором алфавит перечислен в условии (например , а не привычные ) — это нужно проверять каждый раз.
- Сдвиг головки происходит после записи символа в текущую ячейку.
- Работа завершается только по команде с символом .
Исполнитель Редактор:
- Хранит одну строку символов; программа состоит из команд «заменить (a, b)» — заменить первое найденное вхождение подстроки на , и логической проверки «нашлось(a)».
- Типичная конструкция: ПОКА нашлось(a) ЗАМЕНИТЬ (a, b) — выполняется, пока подстрока встречается в строке.
- Замена всегда происходит по самому левому вхождению, после чего поиск начинается заново с начала строки.
Общее: задачи почти всегда просят связать длину/состав исходных данных с длиной/составом результата через одну переменную-параметр (например, длину серии одинаковых символов у края последовательности); итоговый ответ — целое число, значит все промежуточные величины должны быть целыми.
Методы решения
1. Пошаговая трассировка. Подходит для понимания правила работы программы. Берём короткую ленту, например 5 символов, и выполняем такт за тактом, фиксируя состояние, положение головки и содержимое ленты.
2. Формулировка обобщённого правила словами. После трассировки 3–4 тактов замечаем шаблон: программа «движется до первого символа X и останавливается» или «заменяет один тип символов на другой, пока не встретит границу». Мини-пример: если в состоянии команда для 0 — «записать 1, сдвиг , остаться в », а для 1 — «записать 0, стоп» — правило: «идём вправо, превращая нули в единицы, до первой единицы, которую превращаем в 0» — классический инкремент двоичного числа.
3. Введение параметра длины серии и вывод формулы. Обозначаем через длину подряд идущих «проходимых» символов от края до первого «стопового» символа. Выражаем итоговое количество нужных символов через начальное количество и : или (знак зависит от направления замены).
4. Перебор граничных значений параметра для поиска экстремума. Параметр движется в допустимых границах , нужно найти, при каком выражение для достигает нужного экстремума без выхода за ограничения (например , целочисленность).
5. Для Редактора — пошаговое применение цикла замен. Каждую замену рассматриваем как один шаг, отслеживаем изменение длины строки и нужных символов, пока условие «нашлось(a)» не станет ложным. Мини-пример: строка aaab, команда «пока нашлось(ab) заменить(ab,ba)» — буква b сдвигается влево на одну позицию за шаг, после трёх повторений строка становится baaa.
Алгоритм решения по шагам
- Прочитать описание исполнителя и зафиксировать реальный порядок столбцов/строк таблицы — порядок алфавита часто отличается от привычного и меняет смысл программы.
- Определить начальное состояние головки, её начальное положение и направление движения.
- Вручную выполнить 3–5 тактов на коротком примере, чтобы понять, что именно делает программа: движение до границы, замена символов, подсчёт и т.п.
- Сформулировать правило работы программы словами.
- Ввести параметр (обычно длину серии одинаковых символов у края) и выразить конечный результат через исходные данные и этот параметр.
- Определить допустимый диапазон параметра с учётом длины всей последовательности и целочисленности.
- Подставить границы диапазона и выбрать значение параметра, дающее нужный максимум или минимум искомой величины.
- Проверить согласованность ответа: сумма нулей и единиц (или всех символов) должна равняться .
Разбор примеров
Пример 1. Лента содержит символов (нули и единицы), головка стоит справа от последовательности в состоянии . Столбцы таблицы идут в порядке . Команда при — сдвиг влево в (вход в последовательность). В : при — стоп; при 1 — записать 0, стоп; при 0 — записать 1, сдвиг влево, остаться в .
Программа двигается влево от правого края, превращая нули в единицы, пока не встретит первую единицу — она превращается в 0, работа останавливается (если единиц нет вообще, головка доходит до левого края и останавливается на ).
Пусть — число нулей подряд у правого края перед первой единицей. После выполнения эти нулей стали единицами (минус нулей), а следующая единица стала нулём (плюс 1 ноль): По условию , значит . Ограничение: слева от найденной единицы должно остаться место для оставшихся нулей среди позиций, то есть , откуда . Подставляя , получаем , максимум достигается при . Ответ: 999.
Пример 2. Та же логика, , . По формуле , ограничение . Максимум достигается при , давая . Ответ: 599.
В обоих примерах максимум оказался равным — это естественно: предельный случай — вся последовательность из нулей, кроме одной единицы у левого края, которая после работы программы становится нулём, а все остальные нули становятся единицами.
Пример 3. , головка стоит слева от последовательности, движение вправо. Столбцы . при — сдвиг вправо в . В : при — стоп; при 1 — записать 0, сдвиг вправо, остаться в ; при 0 — записать 1, стоп.
Правило: двигаясь вправо, превращаем единицы в нули, пока не встретим первый ноль — он превращается в единицу, работа останавливается.
Пусть — число единиц подряд у левого края перед первым нулём. Эти единиц становятся нулями (плюс нулей), а следующий ноль становится единицей (минус 1 ноль):
По условию , значит . Требуется минимальное число единиц, то есть максимальное (так как ). Максимум достигается при минимальном , а минимально возможное (первый символ слева сразу равен 0). Тогда , единиц . Ответ: 231.
Типичные ошибки и ловушки
- Перепутан порядок столбцов таблицы: если алфавит перечислен как , а не , легко приписать команду не тому символу — это меняет весь смысл программы.
- Забыто, что сдвиг выполняется после записи символа, а не перед ней.
- Не учтён случай, когда программа доходит до противоположного края ленты () без остановки на «рабочем» символе — формула через (или ) для этого случая неприменима, нужен отдельный разбор.
- При поиске экстремума не проверяются ограничения на параметр (целочисленность, ) — можно получить формально «красивое», но недостижимое число.
- Путают «количество символов на ленте после выполнения» с «количеством оставшихся неизменных символов».
- Для Редактора забывают, что после каждой замены поиск подстроки начинается заново с начала строки, а не с места последней замены.
- Путают, что именно требуется найти — количество нулей, единиц или длину строки, и как эта величина связана с параметром роста/убывания.
Как готовиться
Начинать стоит с разбора эталонного примера программы из условия — это подсказка о логике всей серии задач года. Полезно вручную протрассировать программу на ленте из 8–10 символов, чтобы увидеть закономерность самостоятельно, а не запоминать готовое правило. Затем нужно решить 10–15 задач с разными числовыми данными на одну и ту же программу — так вырабатывается навык быстро находить формулу связи между исходными и итоговыми величинами. Отдельно стоит потренироваться на «обратных» задачах (дан результат — найти исходные данные) и на задачах с исполнителем Редактор, где важна аккуратность в подсчёте повторений цикла. После решения каждой задачи полезно проверять ответ на уменьшенном примере: подставить найденные числа в маленьком масштабе и убедиться, что логика программы действительно даёт заявленный результат.
Частые вопросы
Что означает символ S в команде машины Тьюринга?
S означает завершение работы исполнителя сразу после выполнения текущей команды — запись символа происходит, а сдвиг уже не выполняется.
Как понять правильный порядок столбцов в таблице программы?
Порядок столбцов всегда совпадает с порядком, в котором алфавит перечислен в тексте условия, а не с привычным порядком 0, 1, λ — это нужно проверять в каждой задаче отдельно.
Что делать, если головка доходит до края ленты без остановки на рабочем символе?
Это отдельный граничный случай: вся серия символов до края меняется полностью, а обычная формула через параметр серии здесь неприменима, результат нужно посчитать напрямую.
Как решать задачи, где дан результат и нужно найти исходные данные?
Нужно ввести переменную — длину серии символов у соответствующего края последовательности, выразить через неё связь между исходным и итоговым количеством нужных символов, а затем найти допустимый диапазон этой переменной.
Чем исполнитель Редактор отличается от машины Тьюринга?
Редактор работает не с лентой и состояниями, а со строкой символов и командами замены первого вхождения подстроки, часто в цикле «пока найдено — заменить», без явного понятия головки и состояний.
Стоит ли тратить много времени на задание 12, если оно даёт 1 балл?
Задание относительно быстро решается после разбора логики программы, поэтому эффективнее потратить время на понимание одного-двух типовых шаблонов, чем пропускать его.
Как проверить, что найденная формула связи верна?
Нужно взять маленький пример (5–10 символов), подставить в него подобранные значения параметров и вручную протрассировать программу, сравнив итог с полученной формулой.