Информатика: ОГЭ и ЕГЭ

Разборы · ЕГЭ, задание 12

Задание 12 ЕГЭ по информатике: машина Тьюринга

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

В задании 12 дана программа исполнителя МТ (машины Тьюринга) и начальное содержимое ленты. Нужно понять, что сделает программа, и записать результат — например, получившееся число. 1 балл.

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

Как решать

  1. Прочитайте программу по строкам: что делает каждое состояние. Обычно одно состояние «проходит» по цифрам, не меняя их, другое что-то дописывает или заменяет.
  2. Выполните программу на короткой ленте вручную, записывая ленту и положение головки после каждого такта.
  3. Обобщите на исходные данные или смоделируйте работу программой.

Пример из демоверсии 2027

На ленте двоичная запись числа 2025, головка стоит в ближайшей ячейке справа от неё. Программа:

Запишите получившееся число в десятичной системе.

Решение. q0 делает шаг влево на последнюю цифру. q1 идёт влево по цифрам, не меняя их, а в первой пустой ячейке слева пишет 1 и переходит в q2, которое останавливает машину. Итог: к двоичной записи 2025 = 11111101001₂ (11 цифр) слева приписана единица. Это 211 + 2025 = 2048 + 2025 = 4073.

L = "λ"
prog = {("q0", L): (L, "L", "q1"),
        ("q1", L): ("1", "L", "q2"), ("q1", "0"): ("0", "L", "q1"),
        ("q1", "1"): ("1", "L", "q1"),
        ("q2", L): (L, "S", "q2")}

b = bin(2025)[2:]
tape = {i: ch for i, ch in enumerate(b)}
pos, state = len(b), "q0"               # ближайшая ячейка справа
while True:
    write, move, state = prog[(state, tape.get(pos, L))]
    tape[pos] = write
    if move == "S":
        break
    pos += -1 if move == "L" else 1

s = "".join(tape[i] for i in sorted(tape) if tape[i] != L)
print(s, int(s, 2))                     # 111111101001 4073

Типичные ошибки

Потренироваться: задание 12 новые варианты с проверкой ответа

Подготовиться с репетитором

На занятиях разбираем каждое задание в формате экзамена и отрабатываем его на тренажёрах с проверкой по критериям.

Записаться на пробное занятие

Другие разборы