Задание №12 — Анализ строковых алгоритмов
Исполнитель Редактор получает на вход строку цифр и преобразовывает ее. Редактор может выполнить две команды. В обеих командах v и w обозначают цепочки цифр.
A) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (111, 27) преобразует строку 05111150 в строку 0527150. Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
означает, что последовательность команд выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда 1
ИНАЧЕ команда 2
КОНЕЦ ЕСЛИ
выполняется команда 1 (если условие истинно) или команда 2 (если условие ложно).
Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 65 идущих подряд цифр 1? В ответе запишите полученную строку.
НАЧАЛО
ПОКА нашлось (11111) ИЛИ нашлось (15)
ЕСЛИ нашлось (11111)
ТО заменить (11111, 15)
ИНАЧЕ заменить (15, 1)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Правильный ответ
1
Пояснение
Решение:
Команда заменить(v, w) — это s.replace(v, w, 1) (меняется только первое слева вхождение), команда нашлось(v) — это проверка v in s. Значит исполнителя можно точно смоделировать на Python.
Посмотрим, как меняется количество единиц. Замена (11111, 15) убирает пять единиц и добавляет одну, то есть уменьшает число единиц ровно на 4, а замена (15, 1) число единиц не меняет (она лишь убирает пятёрку). Значит остаток количества единиц при делении на 4 сохраняется в течение всей работы программы.
Каждая пятёрка появляется только в паре «15», и после неё всегда стоит единица, поэтому в конце работы (когда не найдено ни 11111, ни 15) пятёрок в строке не остаётся вовсе, а единиц остаётся от 1 до 4. Так как , останется ровно одна единица.
def zamenit(s, v, w):
return s.replace(v, w, 1) # первое слева вхождение
s = "1" * 65
while "11111" in s or "15" in s:
if "11111" in s:
s = zamenit(s, "11111", "15")
else:
s = zamenit(s, "15", "1")
print(s) # 1
Ответ: 1