Подтема 2 из 6
Однократный проход и количества
Таблицы, которые меняют каждый символ один раз, и что по результату можно сказать о входе.
Однократный проход
Что таблица ниже сделает со строкой 111220? Головка начинает в ближайшей пустой ячейке справа, в q0.
| Состояние | λ | 0 | 1 | 2 |
|---|---|---|---|---|
q0 | λ, L, q1 | — | — | — |
q1 | λ, S, q1 | 2, L, q1 | 0, L, q1 | 1, L, q1 |
Если в рабочем состоянии каждая команда пишет символ и сдвигает головку в одну сторону, машина проходит строку один раз, и каждая ячейка меняется сама по себе. Здесь в q1 0 → 2, 1 → 0, 2 → 1, головка идёт влево до пустой ячейки. Из 111220 получится 000112.
Трассу на всей строке писать не нужно: достаточно убедиться, что в q1 каждая команда сдвигает влево и не меняет состояния, и выписать замену символов.
Функция 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))Количества символов
После этой замены в строке три нуля, две единицы и одна двойка. Сколько каких цифр было до?
Если разные символы превращаются в разные, по результату можно точно сказать, сколько каких символов было во входе. Конечный ноль был единицей, конечная единица — двойкой, конечная двойка — нулём. Значит, во входе три единицы, две двойки и один ноль. Порядок символов восстанавливать не нужно.
| Символ результата | Из какого символа получился |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 0 |
Два символа в один
А если таблица заменяет 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.
На коротких строках можно перебрать все входы () и запустить каждый: 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)Тонкости:условие на вход
Условие на вход читают дословно. Пусть в результате шесть единиц и три нуля, а пятёрок во входе больше, чем семёрок. Для наибольшей суммы нужно больше семёрок, но при трёх семёрках пятёрок тоже три — не больше. Значит, семёрок две: 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.
Итого
- Однократный проходкаждая ячейка меняется сама по себе
- Количествапо результату — без порядка символов
- Два в одинизвестна только сумма их количеств
- Условие на результатзадаёт количества: чередование, сумма
- Условие на вход«больше» и «не меньше» дают разные ответы
- Проверкавход, на котором ответ достигается
Проверьте себя
Ответь сначала сам, потом открой ответ.
0120?ОтветСкрыть ответ
2012: каждая цифра меняется сама по себе.ОтветСкрыть ответ
11010?ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Замена в строке 0120
На ленте исполнителя МТ записано слово 0120, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 | 2 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 2, L, q1 | 0, L, q1 | 1, L, q1 |
Какое слово окажется на ленте после остановки?
Введите слово — цифры подряд, без пробелов.
Подсказка
Каждая цифра меняется сама по себе.
Решение
Машина один раз проходит строку и заменяет 0 → 2, 1 → 0, 2 → 1: из 0120 получается 2012.
Ответ: 2012
Единицы до замены
На ленте исполнителя МТ записана строка из цифр 0, 1, 2, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 | 2 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 2, L, q1 | 0, L, q1 | 1, L, q1 |
После выполнения в строке четыре нуля, одна единица и две двойки. Сколько единиц было в исходной строке?
Введите число.
Подсказка
Найди, из какой цифры получается конечный ноль.
Решение
Машина один раз проходит строку и заменяет 0 → 2, 1 → 0, 2 → 1. Конечный ноль получается только из единицы, поэтому единиц было четыре.
Ответ: 4
Число исходных строк
На ленте исполнителя МТ записана строка из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 5 | 7 | 9 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 1, L, q1 | 1, L, q1 | 0, L, q1 |
В результате получилось 11010. Сколько различных исходных строк могли дать такой результат?
Введите число.
Подсказка
Каждая единица могла быть пятёркой или семёркой.
Решение
Нули результата — точно девятки, а каждая из трёх единиц — пятёрка или семёрка независимо от других: 2 · 2 · 2 = 8.
Ответ: 8
Наименьшая сумма при чередовании
На ленте исполнителя МТ записана строка из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 5 | 7 | 9 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 1, L, q1 | 1, L, q1 | 0, L, q1 |
В результате шесть символов, и соседние символы различны. Найди наименьшую возможную сумму цифр исходной строки.
Введите число.
Подсказка
Конечные нули получаются только из девяток.
Решение
Машина заменяет 5 и 7 на 1, а 9 на 0. Чередующаяся строка из шести символов — три единицы и три нуля. Единицы дешевле всего из пятёрок, нули — только из девяток: 3 · 5 + 3 · 9 = 42.
Ответ: 42
Наибольшая сумма при чередовании
На ленте исполнителя МТ записана строка длины 7 из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 5 | 7 | 9 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 1, L, q1 | 1, L, q1 | 0, L, q1 |
В результате соседние символы различны. Найди наибольшую возможную сумму цифр исходной строки.
Введите число.
Подсказка
Сравни оба варианта чередования.
Решение
Чередование из семи символов — четыре единицы и три нуля или три единицы и четыре нуля. Единица дороже всего из семёрки, ноль — девятка: 4 · 7 + 3 · 9 = 55 и 3 · 7 + 4 · 9 = 57. Ответ 57.
Ответ: 57
Наибольшая сумма при условии на вход
На ленте исполнителя МТ записана строка из цифр 5, 7, 9, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 5 | 7 | 9 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 1, L, q1 | 1, L, q1 | 0, L, q1 |
В результате семь единиц и два нуля; во входе пятёрок не меньше, чем семёрок. Найди наибольшую возможную сумму цифр исходной строки.
Введите число.
Подсказка
Семёрок не больше, чем пятёрок.
Решение
Два нуля — две девятки, 18. Семь единиц — пятёрки и семёрки; для наибольшей суммы семёрок как можно больше, но не больше, чем пятёрок: 3 семёрки и 4 пятёрки. 4 · 5 + 3 · 7 + 18 = 59.
Ответ: 59
Наибольшее число двоек
На ленте исполнителя МТ записана строка длины 10 из цифр 0, 1, 2, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 | 2 |
|---|---|---|---|---|
| q0 | λ, L, q1 | — | — | — |
| q1 | λ, S, q1 | 2, L, q1 | 0, L, q1 | 1, L, q1 |
Сумма цифр результата равна 12. Какое наибольшее количество двоек могло быть в исходной строке?
Введите число.
Подсказка
Вырази сумму результата через количества нулей и двоек входа.
Решение
Нули входа дают двойки, двойки — единицы, единицы — нули: сумма результата 2a + c = 12, где a — нули, c — двойки входа. Двоек больше всего при наименьшем a, но a + c ≤ 10: при a = 2 получаем c = 8.
Ответ: 8