Задание №12 — Анализ строковых алгоритмов
Исполнитель Редактор получает на вход строку цифр и преобразовывает ее. Редактор может выполнить две команды. В обеих командах v и w обозначают цепочки цифр.
A) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (111, 27) преобразует строку 05111150 в строку 0527150. Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда 1
ИНАЧЕ команда 2
КОНЕЦ ЕСЛИ
выполняется команда 1 (если условие истинно) или команда 2 (если условие ложно).
Дана программа для Редактора:
НАЧАЛО
ПОКА нашлось (>1) ИЛИ нашлось (>2) ИЛИ нашлось (>3)
ЕСЛИ нашлось (>1)
ТО заменить (>1, 1>)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>2)
ТО заменить (>2, >3)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>3)
ТО заменить (>3, >1)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Правильный ответ
5
Пояснение
Решение:
Посмотрим на роль символа «>». Замены >2 → >3 и >3 → >1 меняют цифру на месте, не сдвигая указатель, и только замена >1 → 1> пропускает цифру влево от указателя, после чего она уже не изменяется.
Значит любая цифра, стоящая за указателем, доводится до единицы: тройка становится единицей, двойка сначала становится тройкой, а потом единицей. В итоге вся строка состоит из единиц, и сумма цифр просто равна их количеству:
Перебираем : , , , — составные, а — простое число. Наименьшее подходящее .
def zamenit(s, v, w):
return s.replace(v, w, 1) # первое слева вхождение
def prostoe(x):
d = 2
while d * d <= x:
if x % d == 0:
return False
d += 1
return x > 1
def rabota(s):
while ">1" in s or ">2" in s or ">3" in s:
if ">1" in s:
s = zamenit(s, ">1", "1>")
if ">2" in s:
s = zamenit(s, ">2", ">3")
if ">3" in s:
s = zamenit(s, ">3", ">1")
return s
n = 1
while True:
s = rabota(">" + "1" * 16 + "2" * n + "3" * 16)
summa = sum(int(c) for c in s if c != ">")
if prostoe(summa):
print(n, summa) # 5 37
break
n += 1
Ответ: 5