Исполнитель МТ представляет собой читающую и записывающую головку, которая может передвигаться вдоль бесконечной горизонтальной ленты, разделённой на равные ячейки. В каждой ячейке находится ровно один символ из алфавита исполнителя (множество символов \(\boldsymbol{A = \{a_0, \, a_1, \, \ldots , \, a_{n-1}\})},\) включая специальный пустой символ \(\boldsymbol{a_0}.\)
Время работы исполнителя делится на дискретные такты (шаги). На каждом такте головка МТ находится в одном из множества допустимых состояний \(\boldsymbol{Q = \{q_0, \, q_1, \, \ldots , \, q_{n-1} \}}.\) В начальный момент времени головка находится в начальном состоянии \(\boldsymbol{q0}.\)
На каждом такте головка обозревает одну ячейку ленты, называемую текущей ячейкой. За один такт головка исполнителя может переместиться в ячейку справа или слева от текущей, не меняя находящийся в ней символ, или заменить символ в текущей ячейке без сдвига в соседнюю ячейку. После каждого такта головка переходит в новое состояние или остаётся в прежнем состоянии.
Программа работы исполнителя МТ задаётся в табличном виде.
| \(a_0\) | \(a_1\) | \(\ldots\) | \(a_n\) | |
| \(q_0\) | команда | команда | \(\ldots\) | команда |
| \(q_1\) | команда | команда | \(\ldots\) | команда |
| \(\ldots\) | \(\ldots\) | \(\ldots\) | \(\ldots\) | \(\ldots\) |
| \(q_{n-1}\) | команда | команда | \(\ldots\) | команда |
В первой строке перечислены все возможные символы в текущей ячейке ленты, в первом столбце – возможные состояния головки. На пересечении \(i\)-й строки и \(j\)-го столбца находится команда, которую выполняет МТ, когда головка обозревает \(j\)-й символ, находясь в \(i\)-м состоянии. Если пара «символ – состояние» невозможна, то клетка для команды остаётся пустой. Каждая команда состоит из трёх элементов, разделённых запятыми: первый элемент – записываемый в текущую ячейку символ алфавита (может совпадать с тем, который там уже записан). Второй элемент – один из четырёх символов «\(L\)», «\(R\)», «\(N\)», «\(S\)». Символы «\(L\)» и «\(R\)» означают сдвиг в левую или правую ячейки соответственно, «\(N\)» – отсутствие сдвига, «\(S\)» – завершение работы исполнителя МТ после выполнения текущей команды. Сдвиг происходит после записи символа в текущую ячейку. Третий элемент – новое состояние головки после выполнения команды.
Например, команда \(0, \, L, q_3\) выполняется следующим образом: в текущую ячейку записывается символ «\(0\)», затем головка сдвигается в соседнюю слева ячейку и переходит в состояние \(q_3.\)
Приведём пример выполнения программы, заданной таблично.
На ленте записано неизвестное ненулевое количество расположенных подряд в соседних ячейках символов «\(Z\)», все остальные ячейки ленты заполнены пустым символом «\(\lambda\)». В начальный момент времени головка находится на неизвестном ненулевом расстоянии справа от самого правого символа «\(Z\)».
Программа
| \(\lambda\) | \(Z\) | |
| \(q_0\) | \(\lambda , \, L, \, q_0\) | \(X, \, L, \, q_1\) |
| \(q_1\) | \(\lambda , \, S, \, q_1\) | \(X, \, L, \, q_1\) |
заменяет на ленте все символы «\(Z\)» на «\(X\)» и останавливает исполнителя в первой ячейке слева от последовательности символов «\(X\)»
Возможное начальное состояние исполнителя:
| \(\ldots\) | \(\lambda\) | \(\lambda\) | \(Z\) | \(Z\) | \(Z\) | \(Z\) | \(\lambda\) | \(\lambda\) | \(\ldots\) |
| \(\blacktriangle q_0\) |
Конечное состояние исполнителя после завершения выполнения программы:
| \(\ldots\) | \(\lambda\) | \(\lambda\) | \(X\) | \(X\) | \(X\) | \(X\) | \(\lambda\) | \(\lambda\) | \(\ldots\) |
| \(\blacktriangle q_0\) |
Выполните задание.
На ленте в соседних ячейках записано двоичное представление числа \(127\) без ведущих нулей. Ячейки справа и слева от последовательности заполнены пустыми символами «\(\lambda\)». В начальный момент времени головка расположена в ближайшей ячейке справа к последовательности.
Программа работы исполнителя:
| \(\lambda\) | \(0\) | \(1\) | |
| \(q_0\) | \(\lambda , \, L, \, q_1\) | ||
| \(q_1\) | \(1, \, R, \, q_2\) | \(1, \, R, \, q_2\) | \(0, \, L, \, q_1\) |
| \(q_2\) | \(1, \, S, \, q_2\) | \(0, \, R, \, q_2\) | \(1 , \, R, \, q_2\) |
Определите результат выполнения программы. В ответе запишите получившееся число в десятичной системе счисления.
Решение:
Python
table = {('q0','l'): 'l,L,q1',
('q1','l'): '1,R,q2', ('q1','0'): '1,R,q2', ('q1','1'): '0,L,q1',
('q2','l'): '1,S,q2', ('q2','0'): '0,R,q2', ('q2','1'): '1,R,q2'}
act = {'L': -1, 'R': 1, 'S': 0}
state = 'q0'
move = ''
strip = ['l'] * 3 + list(bin(127)[2:]) + ['l'] * 3
p = len(strip) - 3
while move != 'S':
ch, move, state = table[(state, strip[p])].split(',')
strip[p] = ch
p += act[move]
ans = ''.join([ch for ch in strip if ch != 'l'])
print(int(ans, 2))
Ответ: \(257\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене