Задание 12 ЕГЭ: машина Тьюринга и исполнитель Редактор — гайд с примерами

Подтемы

Что проверяет задание

Задание 12 проверяет умение формально выполнять алгоритм, заданный для абстрактного исполнителя, шаг за шагом, без ошибок в трактовке правил. В экзамене встречаются два основных исполнителя: машина Тьюринга (МТ) и исполнитель Редактор, работающий со строками символов. Задание проверяет не знание «хитрых» формул, а способность аккуратно смоделировать работу программы, увидеть закономерность в её поведении и применить эту закономерность к большим объёмам данных, которые невозможно протрассировать полностью вручную.

Как выглядит формулировка и сколько баллов

Задание находится в части 1, оценивается в 1 балл, ответ — целое число, калькулятор не нужен, но нужна аккуратность. Условие почти всегда содержит: полное описание правил исполнителя (алфавит, состояния, формат команды), иллюстративный пример работы программы на маленькой ленте или строке, и собственно вопрос: дана лента/строка большой длины (сотни-тысячи символов), известен результат после выполнения программы, требуется найти характеристику исходных данных — максимальное или минимальное количество символов определённого вида. Программа исполнителя из года в год похожа почти буквально, меняются только числа, поэтому важно один раз разобраться в логике конкретного шаблона.

Что нужно знать

Машина Тьюринга:

  • Алфавит A={a0,a1,…,an−1}A=\{a_0,a_1,\dots,a_{n-1}\}, где a0=λa_0=\lambda — пустой символ.
  • Множество состояний Q={q0,q1,…,qm−1}Q=\{q_0,q_1,\dots,q_{m-1}\}, начальное состояние всегда q0q_0.
  • Команда в ячейке таблицы — тройка (записываемый символ; сдвиг L/R/NL/R/N; новое состояние); команда с завершением помечается SS.
  • Порядок символов в заголовке таблицы совпадает с порядком, в котором алфавит перечислен в условии (например λ,1,0\lambda,1,0, а не привычные λ,0,1\lambda,0,1) — это нужно проверять каждый раз.
  • Сдвиг головки происходит после записи символа в текущую ячейку.
  • Работа завершается только по команде с символом SS.

Исполнитель Редактор:

  • Хранит одну строку символов; программа состоит из команд «заменить (a, b)» — заменить первое найденное вхождение подстроки aa на bb, и логической проверки «нашлось(a)».
  • Типичная конструкция: ПОКА нашлось(a) ЗАМЕНИТЬ (a, b) — выполняется, пока подстрока aa встречается в строке.
  • Замена всегда происходит по самому левому вхождению, после чего поиск начинается заново с начала строки.

Общее: задачи почти всегда просят связать длину/состав исходных данных с длиной/составом результата через одну переменную-параметр (например, длину серии одинаковых символов у края последовательности); итоговый ответ — целое число, значит все промежуточные величины должны быть целыми.

Методы решения

1. Пошаговая трассировка. Подходит для понимания правила работы программы. Берём короткую ленту, например 5 символов, и выполняем такт за тактом, фиксируя состояние, положение головки и содержимое ленты.

2. Формулировка обобщённого правила словами. После трассировки 3–4 тактов замечаем шаблон: программа «движется до первого символа X и останавливается» или «заменяет один тип символов на другой, пока не встретит границу». Мини-пример: если в состоянии q1q_1 команда для 0 — «записать 1, сдвиг RR, остаться в q1q_1», а для 1 — «записать 0, стоп» — правило: «идём вправо, превращая нули в единицы, до первой единицы, которую превращаем в 0» — классический инкремент двоичного числа.

3. Введение параметра длины серии и вывод формулы. Обозначаем через tt длину подряд идущих «проходимых» символов от края до первого «стопового» символа. Выражаем итоговое количество нужных символов через начальное количество и tt: Z1=Z0+t−1Z_1=Z_0+t-1 или Z1=Z0−t+1Z_1=Z_0-t+1 (знак зависит от направления замены).

4. Перебор граничных значений параметра для поиска экстремума. Параметр tt движется в допустимых границах 0≤t≤N−10\le t\le N-1, нужно найти, при каком tt выражение для Z0Z_0 достигает нужного экстремума без выхода за ограничения (например Z0≤N−1Z_0\le N-1, целочисленность).

5. Для Редактора — пошаговое применение цикла замен. Каждую замену рассматриваем как один шаг, отслеживаем изменение длины строки и нужных символов, пока условие «нашлось(a)» не станет ложным. Мини-пример: строка aaab, команда «пока нашлось(ab) заменить(ab,ba)» — буква b сдвигается влево на одну позицию за шаг, после трёх повторений строка становится baaa.

Алгоритм решения по шагам

  1. Прочитать описание исполнителя и зафиксировать реальный порядок столбцов/строк таблицы — порядок алфавита часто отличается от привычного и меняет смысл программы.
  2. Определить начальное состояние головки, её начальное положение и направление движения.
  3. Вручную выполнить 3–5 тактов на коротком примере, чтобы понять, что именно делает программа: движение до границы, замена символов, подсчёт и т.п.
  4. Сформулировать правило работы программы словами.
  5. Ввести параметр (обычно длину серии одинаковых символов у края) и выразить конечный результат через исходные данные и этот параметр.
  6. Определить допустимый диапазон параметра с учётом длины всей последовательности и целочисленности.
  7. Подставить границы диапазона и выбрать значение параметра, дающее нужный максимум или минимум искомой величины.
  8. Проверить согласованность ответа: сумма нулей и единиц (или всех символов) должна равняться NN.

Разбор примеров

Пример 1. Лента содержит N=1000N=1000 символов (нули и единицы), головка стоит справа от последовательности в состоянии q0q_0. Столбцы таблицы идут в порядке λ,1,0\lambda,1,0. Команда q0q_0 при λ\lambda — сдвиг влево в q1q_1 (вход в последовательность). В q1q_1: при λ\lambda — стоп; при 1 — записать 0, стоп; при 0 — записать 1, сдвиг влево, остаться в q1q_1.

Программа двигается влево от правого края, превращая нули в единицы, пока не встретит первую единицу — она превращается в 0, работа останавливается (если единиц нет вообще, головка доходит до левого края и останавливается на λ\lambda).

Пусть tt — число нулей подряд у правого края перед первой единицей. После выполнения эти tt нулей стали единицами (минус tt нулей), а следующая единица стала нулём (плюс 1 ноль): Z1=Z0−t+1.Z_1=Z_0-t+1. По условию Z1=343Z_1=343, значит Z0=342+tZ_0=342+t. Ограничение: слева от найденной единицы должно остаться место для оставшихся Z0−tZ_0-t нулей среди N−t−1N-t-1 позиций, то есть Z0−t≤N−t−1Z_0-t\le N-t-1, откуда Z0≤N−1=999Z_0\le N-1=999. Подставляя Z0=342+t≤999Z_0=342+t\le 999, получаем t≤657t\le 657, максимум Z0=999Z_0=999 достигается при t=657t=657. Ответ: 999.

Пример 2. Та же логика, N=600N=600, Z1=233Z_1=233. По формуле Z0=232+tZ_0=232+t, ограничение Z0≤N−1=599Z_0\le N-1=599. Максимум достигается при t=367t=367, давая Z0=599Z_0=599. Ответ: 599.

В обоих примерах максимум оказался равным N−1N-1 — это естественно: предельный случай — вся последовательность из нулей, кроме одной единицы у левого края, которая после работы программы становится нулём, а все остальные нули становятся единицами.

Пример 3. N=400N=400, головка стоит слева от последовательности, движение вправо. Столбцы λ,1,0\lambda,1,0. q0q_0 при λ\lambda — сдвиг вправо в q1q_1. В q1q_1: при λ\lambda — стоп; при 1 — записать 0, сдвиг вправо, остаться в q1q_1; при 0 — записать 1, стоп.

Правило: двигаясь вправо, превращаем единицы в нули, пока не встретим первый ноль — он превращается в единицу, работа останавливается.

Пусть ss — число единиц подряд у левого края перед первым нулём. Эти ss единиц становятся нулями (плюс ss нулей), а следующий ноль становится единицей (минус 1 ноль): Z1=Z0+s−1,Z0=Z1−s+1.Z_1=Z_0+s-1,\qquad Z_0=Z_1-s+1. По условию Z1=168Z_1=168, значит Z0=169−sZ_0=169-s. Требуется минимальное число единиц, то есть максимальное Z0Z_0 (так как Z0+ones=NZ_0+ones=N). Максимум Z0Z_0 достигается при минимальном ss, а минимально возможное s=0s=0 (первый символ слева сразу равен 0). Тогда Z0=169Z_0=169, единиц =400−169=231=400-169=231. Ответ: 231.

Типичные ошибки и ловушки

  • Перепутан порядок столбцов таблицы: если алфавит перечислен как λ,1,0\lambda,1,0, а не λ,0,1\lambda,0,1, легко приписать команду не тому символу — это меняет весь смысл программы.
  • Забыто, что сдвиг выполняется после записи символа, а не перед ней.
  • Не учтён случай, когда программа доходит до противоположного края ленты (λ\lambda) без остановки на «рабочем» символе — формула через tt (или ss) для этого случая неприменима, нужен отдельный разбор.
  • При поиске экстремума не проверяются ограничения на параметр (целочисленность, 0≤t≤N−10\le t\le N-1) — можно получить формально «красивое», но недостижимое число.
  • Путают «количество символов на ленте после выполнения» с «количеством оставшихся неизменных символов».
  • Для Редактора забывают, что после каждой замены поиск подстроки начинается заново с начала строки, а не с места последней замены.
  • Путают, что именно требуется найти — количество нулей, единиц или длину строки, и как эта величина связана с параметром роста/убывания.

Как готовиться

Начинать стоит с разбора эталонного примера программы из условия — это подсказка о логике всей серии задач года. Полезно вручную протрассировать программу на ленте из 8–10 символов, чтобы увидеть закономерность самостоятельно, а не запоминать готовое правило. Затем нужно решить 10–15 задач с разными числовыми данными на одну и ту же программу — так вырабатывается навык быстро находить формулу связи между исходными и итоговыми величинами. Отдельно стоит потренироваться на «обратных» задачах (дан результат — найти исходные данные) и на задачах с исполнителем Редактор, где важна аккуратность в подсчёте повторений цикла. После решения каждой задачи полезно проверять ответ на уменьшенном примере: подставить найденные числа в маленьком масштабе и убедиться, что логика программы действительно даёт заявленный результат.

Частые вопросы

Что означает символ S в команде машины Тьюринга?

S означает завершение работы исполнителя сразу после выполнения текущей команды — запись символа происходит, а сдвиг уже не выполняется.

Как понять правильный порядок столбцов в таблице программы?

Порядок столбцов всегда совпадает с порядком, в котором алфавит перечислен в тексте условия, а не с привычным порядком 0, 1, λ — это нужно проверять в каждой задаче отдельно.

Что делать, если головка доходит до края ленты без остановки на рабочем символе?

Это отдельный граничный случай: вся серия символов до края меняется полностью, а обычная формула через параметр серии здесь неприменима, результат нужно посчитать напрямую.

Как решать задачи, где дан результат и нужно найти исходные данные?

Нужно ввести переменную — длину серии символов у соответствующего края последовательности, выразить через неё связь между исходным и итоговым количеством нужных символов, а затем найти допустимый диапазон этой переменной.

Чем исполнитель Редактор отличается от машины Тьюринга?

Редактор работает не с лентой и состояниями, а со строкой символов и командами замены первого вхождения подстроки, часто в цикле «пока найдено — заменить», без явного понятия головки и состояний.

Стоит ли тратить много времени на задание 12, если оно даёт 1 балл?

Задание относительно быстро решается после разбора логики программы, поэтому эффективнее потратить время на понимание одного-двух типовых шаблонов, чем пропускать его.

Как проверить, что найденная формула связи верна?

Нужно взять маленький пример (5–10 символов), подставить в него подобранные значения параметров и вручную протрассировать программу, сравнив итог с полученной формулой.