Разобраться с нуля 6 шагов

Этот блок лучше пройти перед генератором. Он объясняет идею не через готовую формулу, а через короткие строки, и в самом конце разбирает одну задачу целиком.

Основная программа

Все задачи ниже используют одну и ту же программу. Алфавит исполнителя — 0, 1 и пустой символ λ. Начальное состояние — q0. Головка стартует в ближайшей пустой ячейке справа от исходной последовательности.

Исходная последовательность состоит из N символов, среди которых только нули и единицы. Все ячейки слева и справа от последовательности заполнены символом λ.

Как работает эта программа
  1. Сначала головка находится на пустой ячейке справа от последовательности.
  2. В состоянии q0 на символе λ машина записывает λ, переходит в состояние q1 и сдвигается влево — на последний символ последовательности.
  3. В состоянии q1: если текущий символ 0, машина заменяет его на 1 и идёт влево; если текущий символ 1, заменяет его на 0 и останавливается; если текущий символ λ, останавливается.
  4. Поэтому программа заменяет все нули в конце строки на единицы, а ближайшую слева от них единицу, если она есть, заменяет на ноль.
  5. Если исходная строка состоит только из нулей, программа заменяет все нули на единицы и останавливается на пустой ячейке слева от строки.

Мини-тренажёр: хвост нулей ключ к задаче

Хвост нулей — это нули, которые стоят подряд в самом конце строки. Например, у строки 101000 хвост 000, значит t = 3. Если строка заканчивается единицей, то t = 0.

Строка:

Как думать в таких задачах

10000111
хвост 000 исчез, единица стала нулём
1011010101
последний 0 стал 1, предыдущая 1 стала 0
11111110
хвоста нулей нет, меняется последняя 1
00001111
особый случай: строка вся из нулей
  1. Сначала смотрим на правый конец строки.
  2. Обозначаем через t количество нулей на самом конце.
  3. Если в строке есть единица, машина превращает u 1 0t в u 0 1t.
  4. Поэтому из числа нулей исчезают t хвостовых нулей, но появляется один новый ноль.
  5. Получаем формулу K = Z − t + 1, где Z — нули до работы, K — нули после.

Когда K > 0

Когда K = 0

Отдельный случай: исходная строка могла состоять только из нулей. После работы все нули превратятся в единицы, поэтому Z = N и для минимума, и для максимума.

Подробнее про максимум

Если K > 0, значение K влияет только на то, где именно стоит единственная единица в исходной строке, но не меняет максимальное количество нулей: их всё равно ровно N − 1. Подходящий шаблон исходной строки такой:

0 × (K − 1), затем 1, затем 0 × (N − K)

В такой строке ровно N − 1 нулей и одна единица. После работы хвостовые N − K нулей превратятся в единицы, а единица посередине — в ноль. На ленте останется K − 1 + 1 = K нулей, что и требовалось.

Математика решения

Обозначим:

Если строка не состоит целиком из нулей, её можно представить так:

u 1 0t

где 0t — хвост из t нулей, 1 — ближайшая слева от этого хвоста единица, u — часть строки левее этой единицы.

Программа делает преобразование:

u 1 0t → u 0 1t

Поэтому число нулей после работы связано с исходным числом нулей формулой:

K = Z − t + 1, откуда Z = K + t − 1.

Для K > 0:

Особый случай K = 0: исходная последовательность могла состоять только из нулей, тогда все нули превратились в единицы. И минимум, и максимум числа нулей в исходной последовательности равны N.

Генератор задач

Случайные N от 50 до 2000 и корректное K от 0 до N. Чаще выбирается K > 0, чтобы задача не сводилась к особому случаю.

Готовые задачи

Три готовых задачи с известными ответами. Их можно загрузить в текущую задачу.

Ручной режим

Задайте свои N и K и выберите, что искать. Дробные значения не принимаются.

Текущая задача

Задача ещё не выбрана. Сгенерируйте новую, загрузите готовую или задайте параметры вручную.

Симулятор машины Тьюринга

Введите короткую двоичную строку. Кнопка «Один шаг» сразу выполняет первый переход, даже если симуляция ещё не была запущена.

Теоретическая часть

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

Описание исполнителя

Исполнитель машины Тьюринга — это читающая и записывающая головка, которая движется вдоль бесконечной горизонтальной ленты, разделённой на равные ячейки. В каждой ячейке стоит ровно один символ из алфавита исполнителя. Алфавит включает специальный пустой символ λ.

Время работы делится на дискретные такты. На каждом такте головка находится в одном из допустимых состояний Q = {q0, q1, …, qm−1}. В начальный момент головка находится в состоянии q0.

За один такт головка обозревает одну ячейку — текущую — и может выполнить одно из действий:

  • сдвинуться вправо или влево, не меняя символ в текущей ячейке;
  • заменить символ в текущей ячейке без сдвига;
  • заменить символ в текущей ячейке и сдвинуться в соседнюю;
  • завершить работу.

После каждого такта головка переходит в новое состояние или остаётся в прежнем.

Как задаётся программа

Программа работы исполнителя задаётся таблицей. В первой строке перечислены возможные символы в текущей ячейке, в первом столбце — возможные состояния. На пересечении строки и столбца стоит команда. Если такая пара «символ — состояние» невозможна, клетка остаётся пустой.

Команда имеет вид:

новый_символ, движение, новое_состояние

Второй элемент — направление движения:

  • L — сдвиг влево;
  • R — сдвиг вправо;
  • N — отсутствие сдвига;
  • S — завершение работы после выполнения текущей команды.

Например, команда 0, L, q3 означает: записать в текущую ячейку 0, сдвинуть головку влево и перейти в состояние q3.

Дополнительно: пример чтения другой таблицы команд

Этот пример нужен только как иллюстрация того, как читается таблица команд. Он использует другую программу — с символами Z и X вместо нулей и единиц.

На ленте записано неизвестное ненулевое количество расположенных подряд в соседних ячейках символов Z; остальные ячейки заполнены пустым символом λ. В начальный момент времени головка находится на неизвестном ненулевом расстоянии справа от самого правого символа Z.

состояниеλZ
q0λ, L, q0X, L, q1
q1λ, S, q1X, L, q1

Программа заменяет на ленте все символы Z на X и останавливает исполнителя в первой ячейке слева от последовательности.

  1. В состоянии q0 машина идёт влево по пустым клеткам, пока не встретит правый край блока символов Z.
  2. Первый встреченный Z заменяется на X, машина переходит в состояние q1 и продолжает идти влево.
  3. В состоянии q1 каждый символ Z заменяется на X.
  4. Когда слева от блока встречается пустой символ λ, машина останавливается.
Автотесты функции решения и симулятора

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