Задание №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, 222>)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>2)
ТО заменить (>2, 3>)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>3)
ТО заменить (>3, 1>)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход приведенной выше программе поступает строка, начинающаяся с символа «>», а затем содержащая 11 цифр 1, n цифр 2 и 11 цифр 3, расположенных в произвольном порядке.
Определите наименьшее значение n, при котором сумма числовых значений цифр строки, получившейся в результате выполнения программы, является простым числом.
Правильный ответ
2
Пояснение
Решение:
Символ «>» — это указатель, который двигается по строке слева направо: каждая замена обрабатывает цифру, стоящую сразу за указателем, и оставляет результат слева от «>», где он уже не изменится:
- >1 → 222> : цифра 1 даёт три двойки, вклад в сумму 6;
- >2 → 3> : цифра 2 даёт тройку, вклад 3;
- >3 → 1> : цифра 3 даёт единицу, вклад 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", "222>")
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" * 11 + "2" * n + "3" * 11)
summa = sum(int(c) for c in s if c != ">")
if prostoe(summa):
print(n, summa) # 2 83
break
n += 1
Ответ: 2