ЕГЭ · ЗАДАНИЕ 12
Машина Тьюринга · №25239
На ленте двоичная запись 32768 с неизвестным количеством ведущих нулей. Головка q0 — в ближайшей пустой ячейке справа, вне записи λ. После исполнения таблицы осталось 200 нулей. Найдите наибольшее исходное количество нулей.
| Состояние / символ | λ | 0 | 1 |
|---|---|---|---|
| q0 | λ, L, q1 | — | — |
| q1 | λ, S, q1 | 1, L, q2 | 0, S, q2 |
| q2 | λ, S, q1 | 0, L, q1 | 1, L, q1 |
Команда: записать символ → L (влево), R (вправо), N (без сдвига) или S (остановиться после записи) → новое состояние. Прочерк — отсутствие команды, не остановка.
Источник задания
Сначала попробуй решить самостоятельно, затем открой разбор. Для автоматической проверки ответа включи JavaScript.
Показать решение по шагам
Разбор решения
Ответ: 402
32768₂ записывается как 1 и 15 нулей. Состояния чередуются; из 15 хвостовых нулей 8 станут единицами, 7 останутся нулями. Единица попадает в q2 и сохраняется. Из k ведущих нулей остаётся floor(k/2). Значит 7+floor(k/2)=200: k равно 386 или 387. Максимум исходных нулей: 387+15=402.
def run(word, table, side="right"):
tape = dict(enumerate(word))
pos = len(word) if side == "right" else -1
state = 0
for step in range(100000):
symbol = tape.get(pos, "λ")
if symbol not in table[state]:
raise ValueError("Нет команды для текущей пары")
write, move, new_state = table[state][symbol]
tape[pos] = write
state = new_state
if move == "S":
cells = [i for i, x in tape.items() if x != "λ"]
if not cells:
return ""
return "".join(tape.get(i, "λ") for i in range(min(cells), max(cells)+1))
pos += {"L": -1, "R": 1, "N": 0}[move]
raise RuntimeError("Достигнут предел шагов, это не доказательство остановки")
table = [{'λ': ('λ', 'L', 1)}, {'λ': ('λ', 'S', 1), '1': ('0', 'S', 2), '0': ('1', 'L', 2)}, {'λ': ('λ', 'S', 1), '1': ('1', 'L', 1), '0': ('0', 'L', 1)}]
# По доказанному равенству достаточно проверить k=386 и k=387.
valid = [k for k in (386, 387) if run("0"*k+bin(32768)[2:], table).count("0")==200]
print(max(valid)+15)