вернуться
Информатика

Вопрос 14

Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

А) заменить (v, w).

Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды  заменить (111, 27)  преобразует строку 05111150 в строку 0527150.  Если в строке нет вхождений цепочки v, то выполнение команды  заменить (v, w) не меняет эту строку.

Б) нашлось (v). Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется. 


Цикл

ПОКА  условие
последовательность коман
д
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции ЕСЛИ  условие  
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно). 

Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 69 идущих подряд цифр 8? В ответе запишите полученную строку. 
НАЧАЛО
ПОКА  нашлось (3333)  ИЛИ нашлось (8888)
ЕСЛИ  нашлось (3333)
ТО заменить (3333, 88)      
ИНАЧЕ заменить (8888, 33)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ

Решение №1

Задание проверяет умение анализировать алгоритм действий формального исполнителя. Обратим внимание, что мы имеем дело с циклическим алгоритмом, в котором количество итераций цикла заранее не известно и будет зависеть от значения переменных перед началом цикла. При этом можно предположить, что количество итераций цикла может оказаться достаточно большим и полное формальное исполнение алгоритма является нерациональным.

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

  1. Проанализировать первые несколько итераций и определить период изменения обрабатываемого объекта так, что некоторую последовательность итераций можно заменить одним действием над объектом.
  2. С помощью деления с остатком исключить из рассмотрения большую часть итераций цикла, оставив только несколько последних итераций.
  3. Формально выполнить эти последние итерации, тем самым определив значение искомой переменной после завершения программы.

Рассмотрим применение предложенного метода на примере приведенного условия.

  1. Сформулированный алгоритм реализует обработку строки. Проанализируем его. Сначала исполнитель пытается найти последовательность цифр «3333», рассматривая строку слева направо. Если такая последовательность нашлась, она будет заменена на «88» и обработка начнется заново. Если последовательность «3333» не найдена, но найдена последовательность «8888», то она будет заменена на «33» и обработка строки опять же начнется заново. Если в строке не осталось последовательностей «3333» или «8888», то выполнение программы завершится. Подчеркнем, что исполнитель всегда сначала будет искать последовательность «3333», и если найдет, то заменять ее последовательностью «88», после чего опять анализировать строку сначала. И только если в строке нет последовательности «3333», будет пытаться искать и заменять последовательность «8888».
  2. Рассмотрим первые несколько итераций алгоритма. Для удобства, будем обозначать последовательности из N идущих подряд цифр M как N{M}.
    • Исходная строка может быть обозначена как 69{8}. Исполнитель не найдет в ней последовательность «3333», но найдет последовательность «8888» и заменит на ее на «33». Следовательно, после первой итерации мы получим строку 2{3}65{8}.
    • На второй итерации по-прежнему исполнитель не найдет последовательность «3333», но найдет последовательность «8888», которую также заменит на «33». В результате, после второй итерации мы получим строку 4{3}61{8}.
    • На третьей итерации исполнитель найдет последовательность «3333» и заменит ее на «88». Таким образом, после выполнения этой итерации мы получим строку 63{8}. Заметим, что в результате выполнения трех итераций мы опять получили строку, состоящую только из цифр «8», причем их количество уменьшилось на 6.
  3. Получается, что каждая последовательность из трех итераций цикла фактически заменяет первые 8 цифр «8» на 2 цифры «8». Обратим внимание, что это почти всегда эквивалентно тому, что из строки, состоящей только из цифр «8» удаляют первые 6 цифр. Но следует отметить, что это будет справедливо, только если в строке на момент удаления не менее восьми цифр «8» и соответственно после удаления может остаться не менее двух цифр «8».
  4. Поделим 69 на 6 с остатком. Получим 11 и 3 в остатке. Поскольку остаток не меньше 2, можно сделать вывод, что на предыдущем шаге была строка не менее чем из 8 цифр «8», шесть из которых удалили. Полученная в результате строка «888» не содержит последовательностей «3333» или «8888», следовательно, цикл обработки завершится и ответом на задание будет «888».

Рассмотрим еще два примера, немного меняя исходное условие:

  1. Предположим, что по условию задания программа применялась к строке, состоящей из 67 цифр «8». Тогда если поделить с остатком 67 на 6, получится 11 и 1 в остатке. Остаток меньше 2, но строка из одной цифры «8» не могла быть получена. Следовательно, нужно рассмотреть 67 как 10*6+7. Тогда на очередной итерации цикла была получена строка 8888888, то есть строка, состоящая из семи цифр «8». Ее дальнейшее преобразование будет выглядеть следующим образом: 8888888 → 33888. И ответом на такую формулировку задания будет «33888».
  2. Предположим, что по условию задания программа применялась к строке, состоящей из 66 цифр 8. Остаток от деления 66 на 6 равен  нулю. Отметим, что 66=6*10+6. Это значит, что после 10 удалений должна получиться строка 888888. Тогда после очередной итерации цикла она преобразуется: 888888 → 3388. Дальнейшее преобразование невозможно и программа завершится. Следовательно, ответом на такую формулировку задания будет «3388».
Alexander Mayatin

Решение задачи предоставлено компанией: ITMO
Университет ИТМО – ведущий вуз России в области информационных и фотонных технологий, один из немногих российских вузов, получивших в 2009 году статус национального исследовательского университета, первый неклассический университет.