Исполнитель Редактор получает на вход строку цифр и преобразует её. Редактор может выполнять две команды, в обеих
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение
Если в строке нет вхождений
Б) нашлось (v).
Эта команда проверяет, встречается ли
Дана программа для редактора:
НАЧАЛО
ПОКА НЕ нашлось (00)
заменить (01, 220)
заменить (02, 1013)
заменить (03, 120)
КОНЕЦ ПОКА
КОНЕЦ
Известно, что в исходной
Какое наименьшее количество цифр могло быть
Приведём решение на языке Python.
A = []
for x in range(20,-1,-1):
for y in range(20,-1,-1):
for z in range(20,-1,-1):
num = '0' + '1'*x + '2'*y + '3'*z +'0'
while '00' not in num:
num = num.replace('01','220',1)
num = num.replace('02','1013',1)
num = num.replace('03','120',1)
if num.count('1') == 13 and num.count('2') == 18:
A.append(x + y + z)
print(min(A) + 2)
Ответ: 10.
Приведём аналитическое решение Юрия Красильникова.
В алгоритме выполняются следующие замены:
01->220
02->1013->12203->122120
03->120
Каждая единица превращается в выходной строке в две двойки, двойка — в две единицы и три двойки, а тройка — в единицу и двойку.
Если во входной строке было
Имеем систему из двух уравнений с тремя неизвестными: Тогда
где x, y, z — целые неотрицательные числа.
Если вычесть из нижнего уравнения верхнее, получим
Данное уравнение имеет всего три решения в неотрицательных целых числах: x = 0, y = 5; x = 1, y = 3; x = 2, y = 1.
Из верхнего уравнения можно выразить
Имеем решения x = 0, y = 5, z = 3; x = 1, y = 3, z = 7; x = 2, y = 1, z = 11.
Наименьшая сумма x + y + z = 8 — в первом решении.
Учитывая два нуля в начале и конце исходной строки, получаем ответ: 10.

