К содержанию

Подтема 2 из 6

Однократный проход и количества

Таблицы, которые меняют каждый символ один раз, и что по результату можно сказать о входе.

Однократный проход

Что таблица ниже сделает со строкой 111220? Головка начинает в ближайшей пустой ячейке справа, в q0.

Состояниеλ012
q0λ, L, q1———
q1λ, S, q12, L, q10, L, q11, L, q1

Если в рабочем состоянии каждая команда пишет символ и сдвигает головку в одну сторону, машина проходит строку один раз, и каждая ячейка меняется сама по себе. Здесь в q1 0 → 2, 1 → 0, 2 → 1, головка идёт влево до пустой ячейки. Из 111220 получится 000112.

Каждая ячейка меняется по своей стрелке: единицы стали нулями, двойки — единицами, ноль — двойкой. Порядок ячеек тот же.
Вручную

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

Python

Функция run_tm из подтемы 1 подтверждает замену:

rules = {    ('q0', 'λ'): ('λ', 'L', 'q1'),    ('q1', 'λ'): ('λ', 'S', 'q1'),    ('q1', '0'): ('2', 'L', 'q1'),    ('q1', '1'): ('0', 'L', 'q1'),    ('q1', '2'): ('1', 'L', 'q1'),}print(run_tm('111220', rules, 6))
('000112', -1, 8)

Количества символов

После этой замены в строке три нуля, две единицы и одна двойка. Сколько каких цифр было до?

Если разные символы превращаются в разные, по результату можно точно сказать, сколько каких символов было во входе. Конечный ноль был единицей, конечная единица — двойкой, конечная двойка — нулём. Значит, во входе три единицы, две двойки и один ноль. Порядок символов восстанавливать не нужно.

Символ результатаИз какого символа получился
01
12
20

Два символа в один

А если таблица заменяет 5 и 7 на 1, а 9 на 0? Какая строка дала результат 101101?

Если два исходных символа дают один и тот же результат, по результату известна только их общая численность. Каждая конечная единица — пятёрка или семёрка, каждый ноль — точно девятка. Разных подходящих строк здесь 2⁴ = 16.

Одна из подходящих строк: пятёрки и семёрки стали единицами, девятки — нулями. По результату их уже не различить.

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

Условие на результат

При той же замене результат из 9 символов чередуется: соседние цифры разные. Какая наименьшая сумма цифр могла быть во входе?

Условие на результат задаёт количества: чередование из 9 символов — это пять единиц и четыре нуля или четыре единицы и пять нулей. Единица выгоднее всего из пятёрки, ноль — только из девятки, поэтому лучше больше единиц: 5 · 5 + 4 · 9 = 61. Строка 595959595 даёт 101010101.

Вручную

Сравни оба варианта: 5 · 5 + 4 · 9 = 61 и 4 · 5 + 5 · 9 = 65. Меньше 61 не бывает: девяток не меньше четырёх, а каждая единица стоит хотя бы 5.

Python

На коротких строках можно перебрать все входы () и запустить каждый: 3⁹ = 19 683 строки.

from itertools import productrules = {    ('q0', 'λ'): ('λ', 'L', 'q1'),    ('q1', 'λ'): ('λ', 'S', 'q1'),    ('q1', '5'): ('1', 'L', 'q1'),    ('q1', '7'): ('1', 'L', 'q1'),    ('q1', '9'): ('0', 'L', 'q1'),}best = Nonefor digits in product('579', repeat=9):    word = ''.join(digits)    result, pos, steps = run_tm(word, rules, 9)    if '00' not in result and '11' not in result:        s = sum(int(d) for d in word)        if best is None or s < best:            best = sprint(best)
61
Тонкости:условие на вход

Условие на вход читают дословно. Пусть в результате шесть единиц и три нуля, а пятёрок во входе больше, чем семёрок. Для наибольшей суммы нужно больше семёрок, но при трёх семёрках пятёрок тоже три — не больше. Значит, семёрок две: 4 · 5 + 2 · 7 + 3 · 9 = 61. При «не меньше» подошли бы три семёрки, и ответ был бы 63.

Сумма результата

Строка длины 10 из цифр 0, 1, 2 прошла замену 0 → 2, 1 → 0, 2 → 1, сумма цифр результата — 12. Какое наибольшее число двоек могло быть во входе?

Сумму результата выражают через количества входа, а наибольшее или наименьшее ищут по границам. Пусть во входе a нулей и c двоек. Нули дают двойки, двойки — единицы, единицы — нули: сумма 2a + c = 12, то есть c = 12 − 2a. Двоек больше всего при наименьшем a, но нулей и двоек вместе не больше 10. При a = 0 вышло бы c = 12, при a = 1 — c = 10 и 11 символов. При a = 2 — c = 8, ровно 10 символов: подходит.

Ответ 8. Проверка: 0022222222 → 2211111111, сумма 2 + 2 + 8 = 12.

Итого

  • Однократный проходкаждая ячейка меняется сама по себе
  • Количествапо результату — без порядка символов
  • Два в одинизвестна только сумма их количеств
  • Условие на результатзадаёт количества: чередование, сумма
  • Условие на вход«больше» и «не меньше» дают разные ответы
  • Проверкавход, на котором ответ достигается

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Таблица заменяет 0 → 2, 1 → 0, 2 → 1. Что получится из строки 0120?
ОтветСкрыть ответ
Ответ
2012: каждая цифра меняется сама по себе.
Вопрос 2
После той же замены в строке четыре нуля, одна единица и две двойки. Сколько единиц было до замены?
ОтветСкрыть ответ
Ответ
4: конечный ноль получается только из единицы.
Вопрос 3
Таблица заменяет 5 и 7 на 1, а 9 на 0. Сколько разных строк могли дать результат 11010?
ОтветСкрыть ответ
Ответ
8: каждая из трёх единиц — пятёрка или семёрка, 2 · 2 · 2.
Вопрос 4
При той же замене результат из 6 символов чередуется. Найди наименьшую сумму цифр исходной строки.
ОтветСкрыть ответ
Ответ
42: три единицы из пятёрок и три нуля из девяток, 15 + 27.
Вопрос 5
Почему при замене 5 → 1 и 7 → 1 по результату нельзя узнать число пятёрок?
ОтветСкрыть ответ
Ответ
Обе цифры дают единицу: известна только сумма количеств пятёрок и семёрок.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Замена в строке 0120

На ленте исполнителя МТ записано слово 0120, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ012
q0λ, L, q1———
q1λ, S, q12, L, q10, L, q11, L, q1

Какое слово окажется на ленте после остановки?

Введите слово — цифры подряд, без пробелов.

Единицы до замены

На ленте исполнителя МТ записана строка из цифр 0, 1, 2, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ012
q0λ, L, q1———
q1λ, S, q12, L, q10, L, q11, L, q1

После выполнения в строке четыре нуля, одна единица и две двойки. Сколько единиц было в исходной строке?

Введите число.

Число исходных строк

На ленте исполнителя МТ записана строка из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ579
q0λ, L, q1———
q1λ, S, q11, L, q11, L, q10, L, q1

В результате получилось 11010. Сколько различных исходных строк могли дать такой результат?

Введите число.

Наименьшая сумма при чередовании

На ленте исполнителя МТ записана строка из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ579
q0λ, L, q1———
q1λ, S, q11, L, q11, L, q10, L, q1

В результате шесть символов, и соседние символы различны. Найди наименьшую возможную сумму цифр исходной строки.

Введите число.

Наибольшая сумма при чередовании

На ленте исполнителя МТ записана строка длины 7 из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ579
q0λ, L, q1———
q1λ, S, q11, L, q11, L, q10, L, q1

В результате соседние символы различны. Найди наибольшую возможную сумму цифр исходной строки.

Введите число.

Наибольшая сумма при условии на вход

На ленте исполнителя МТ записана строка из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ579
q0λ, L, q1———
q1λ, S, q11, L, q11, L, q10, L, q1

В результате семь единиц и два нуля; во входе пятёрок не меньше, чем семёрок. Найди наибольшую возможную сумму цифр исходной строки.

Введите число.

Наибольшее число двоек

На ленте исполнителя МТ записана строка длины 10 из цифр 0, 1, 2, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ012
q0λ, L, q1———
q1λ, S, q12, L, q10, L, q11, L, q1

Сумма цифр результата равна 12. Какое наибольшее количество двоек могло быть в исходной строке?

Введите число.