Задание 12: Выполнение алгоритмов для исполнителей
Как выглядит
Задание находится в части 1, оценивается в 1 балл, ответ — целое число, калькулятор не нужен, но нужна аккуратность. Условие почти всегда содержит: полное описание правил исполнителя (алфавит, состояния, формат команды), иллюстративный пример работы программы на маленькой ленте или строке, и собственно вопрос: дана лента/строка большой длины (сотни-тысячи символов), известен результат после выполнения программы, требуется найти характеристику исходных данных — максимальное или минимальное количество символов определённого вида. Программа исполнителя из года в год похожа почти буквально, меняют …
Что нужно знать
Машина Тьюринга:
- Алфавит , где — пустой символ.
- Множество состояний , начальное состояние всегда .
- Команда в ячейке таблицы — тройка (записываемый символ; сдвиг ; новое состояние); команда с завершением помечается .
- Порядок символов в заголовке таблицы совпадает с порядком, в котором алфавит перечислен в условии (например , а не привычные ) — это нужно проверять каждый раз.
- Сдвиг головки происходит после записи символа в текущую ячейку.
- Работа завершается только по команде с символом .
Исполнитель Редактор:
- Хранит одну строку символов; программа состоит из команд «заменить (a, b)» — заменить первое найденное вхождение подстроки на , и логической проверки «нашлось(a)».
- Типичная конструкция: ПОКА нашлось(a) ЗАМЕНИТЬ (a, b) — выполняется, пока подстрока встречается в строке.
- Замена всегда происходит по самому левому вхождению, после чего поиск начинается заново с начала строки.
Общее: задачи почти всегда просят связать длину/состав исходных данных с длиной/составом результата через одну переменную-параметр (например, длину серии одинаковых символов у края последовательности); итоговый ответ — целое число, значит все промежуточные величины должны быть целыми.
Алгоритм
- Прочитать описание исполнителя и зафиксировать реальный порядок столбцов/строк таблицы — порядок алфавита часто отличается от привычного и меняет смысл программы.
- Определить начальное состояние головки, её начальное положение и направление движения.
- Вручную выполнить 3–5 тактов на коротком примере, чтобы понять, что именно делает программа: движение до границы, замена символов, подсчёт и т.п.
- Сформулировать правило работы программы словами.
- Ввести параметр (обычно длину серии одинаковых символов у края) и выразить конечный результат через исходные данные и этот параметр.
- Определить допустимый диапазон параметра с учётом длины всей последовательности и целочисленности.
- Подставить границы диапазона и выбрать значение параметра, дающее нужный максимум или минимум искомой величины. …
Ловушки
- Перепутан порядок столбцов таблицы: если алфавит перечислен как , а не , легко приписать команду не тому символу — это меняет весь смысл программы.
- Забыто, что сдвиг выполняется после записи символа, а не перед ней.
- Не учтён случай, когда программа доходит до противоположного края ленты () без остановки на «рабочем» символе — формула через (или ) для этого случая неприменима, нужен отдельный разбор.
- При поиске экстремума не проверяются ограничения на параметр (целочисленность, ) — можно получить формально «красивое», но недостижимое число.
- Путают «количество символов на ленте после выполнения» с «количеством оставшихся неизменных символов».
- Для Редактора забывают, что после каждой замены поиск подстроки начинается заново с начала строки, а не с места последней замены. …