12.02 Исполнитель «Редактор» – строка с произвольным порядком цифр
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в
которых и
обозначают последовательности цифр:
А) заменить
Эта команда заменяет в строке первое слева вхождение последовательности на последовательность
Например, выполнение команды заменить преобразует строку
в строку
Если в строке нет вхождений последовательности то выполнение команды заменить
не меняет эту
строку.
Б) Нашлось
Эта команда проверяет, встречается ли последовательность в строке исполнителя Редактор. Если она
встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение
«ложь».
Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
Выполняется, пока условие истинно.
В конструкции:
ЕСЛИ условие
ТО команда1
КОНЕЦ ЕСЛИ Выполняется команда1 (если условие истинно).
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ Выполняется Выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Найдите сумму числовых значений цифр в строке, получившейся в результате применения приведённой ниже программы к строке, начинающейся с символа «*», а затем находятся 30 цифр 2, 63 цифры 5, 36 цифр 9, расположенные в произвольном порядке.
НАЧАЛО
ПОКА нашлось ИЛИ нашлось
ИЛИ нашлось
ЕСЛИ нашлось
ТО заменить
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось
ТО заменить
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось
ТО заменить
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
s = ’*’ + ’2’ * 30 + ’5’ * 63 + ’9’ * 36 while ’*2’ in s or ’*5’ in s or ’*9’ in s: if ’*2’ in s: s = s.replace(’*2’, ’*’, 1) if ’*5’ in s: s = s.replace(’*5’, ’6*’, 1) if ’*9’ in s: s = s.replace(’*9’, ’7*’, 1) print(sum((int(x) for x in s if x != ’*’)))
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды,
в обеих командах и
обозначают цепочки цифр.
А) заменить ,
.
Эта команда заменяет в строке первое слева вхождение цепочки на цепочку
. Например, выполнение команды
заменить(334, 27) преобразует строку 12113341121 в строку 1211271121.
Если в строке нет вхождений цепочки , то выполнение команды заменить
,
не меняет эту
строку.
Б) нашлось .
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции ЕСЛИ условие
ТО команда1
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно).
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Дана программа для Редактора: НАЧАЛО
ПОКА нашлось (>) ИЛИ нашлось (>
) ИЛИ нашлось(>
)
ЕСЛИ нашлось (>)
ТО заменить (>,
>)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось(>)
ТО заменить (>,
>)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (>)
ТО заменить (>,
>)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход приведённой ниже программе поступает строка, начинающаяся с символа «>», а затем содержащая
цифр
,
цифр
и
цифр
, расположенных в произвольном порядке.
Определите сумму числовых значений цифр строки, получившейся в результате выполнения программы. Так,
например, если результат работы программы представлял бы собой строку, состоящую из цифр
, то верным
ответом было бы число
.
Решение руками:
Можно заметить, что программа меняет каждую цифру последовательности на что-то другое, при этом каждая цифра меняется только один раз, так как после замены «курсор» передвигается к следующей цифре.
Таким образом, все единицы изначальной строки будут заменены на 41, все двойки на 5, а все тройки на 44. Так как единиц было 15, то и комбинаций «41» будет 15. Двоек было 20, значит и «5» будет 20. Троек было 8, значит и комбинаций «44» будет 8.
Отсюда получаем, что в итоговой строке 15 единиц, 20 пятерок и четверка. Итоговая сумма данной
строки равна:
.
Решение программой:
s = ’>’ + ’1’ * 15 + ’2’ * 20 + ’3’ * 8 while (’>1’ in s) or (’>2’ in s) or (’>3’ in s): if ’>1’ in s: s = s.replace(’>1’, ’41>’, 1) if ’>2’ in s: s = s.replace(’>2’, ’5>’, 1) if ’>3’ in s: s = s.replace(’>3’, ’44>’, 1) print(s.count(’1’) + 2 * s.count(’2’) + 3 * s.count(’3’) + 4 * s.count(’4’) + 5 * s.count(’5’))
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в которых v и w обозначают последовательности цифр.
А) заменить (v,w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (121, 3) преобразует строку 112112 в строку 1312.
Если в строке нет вхождений последовательности v, то выполнение команды не изменяет исходную строку.
Б) Нашлось (v).
Эта команда проверяет, встречается ли последовательность v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА нашлось (83) ИЛИ нашлось (85)
ЕСЛИ нашлось (83)
ТО заменить (83, 48)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (85)
ТО заменить (85, 68)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход программы, приведенной выше, поступает строка, начинающаяся с цифры ”8” , а затем содержащая m цифр ”3” и m цифр ”5”, расположенных в произвольном порядке. Определите наименьшее значение m, при котором сумма числовых значений цифр строки, получившейся в результате выполения программы, делится на 17 без остатка.
mn = 10**10 for m in range(10): # Т.к. порядок произвольный, то рассматриваем разные ситуации s1 = ’8’ + ’3’*m + ’5’*m s2 = ’8’ + ’5’*m + ’3’*m while ’83’ in s1 or ’85’ in s1: if ’83’ in s1: s1 = s1.replace(’83’, ’48’, 1) if ’85’ in s1: s1 = s1.replace(’85’, ’68’, 1) sm = sum([int(i) for i in s1]) if sm % 17 == 0: mn = min(mn, m) while ’83’ in s2 or ’85’ in s2: if ’83’ in s2: s2 = s2.replace(’83’, ’48’, 1) if ’85’ in s2: s2 = s2.replace(’85’, ’68’, 1) sm = sum([int(i) for i in s2]) if sm % 17 == 0: mn = min(mn, m) print(mn)
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в которых v и w обозначают последовательности цифр.
А) заменить (v,w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (121, 3) преобразует строку 112112 в строку 1312.
Если в строке нет вхождений последовательности v, то выполнение команды не изменяет исходную строку.
Б) Нашлось (v).
Эта команда проверяет, встречается ли последовательность v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА нашлось (0000) или нашлось (111)
ЕСЛИ нашлось (0000)
ТО заменить (0000, 110)
ИНАЧЕ
заменить (111, 0)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход программе подана строка из 400 нулей и 1 единицы, расположенные в произвольном порядке. Найдите строку наименьшей длины, которая может получиться в результате работы алгоритма. В ответ запишите длину этой строки.
# Сравниваем длины итоговых строк при строках с разным порядком s1 = ’0’*400 + ’1’ s2 = ’1’ + ’0’*400 while ’0000’ in s1 or ’111’ in s1: if ’0000’ in s1: s1 = s1.replace(’0000’, ’110’, 1) else: s1 = s1.replace(’111’, ’0’, 1) while ’0000’ in s2 or ’111’ in s2: if ’0000’ in s2: s2 = s2.replace(’0000’, ’110’, 1) else: s2 = s2.replace(’111’, ’0’, 1) print(len(s1)) print(len(s2))
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в которых v и w обозначают последовательности цифр.
А) заменить (v,w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (121, 3) преобразует строку 112112 в строку 1312.
Если в строке нет вхождений последовательности v, то выполнение команды не изменяет исходную строку.
Б) Нашлось (v).
Эта команда проверяет, встречается ли последовательность v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА нашлось (777) или нашлось (99)
ЕСЛИ нашлось (777) ТО заменить (777, 922)
ИНАЧЕ заменить (99, 2)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Какое наибольшее количество двоек получится в результате применения приведённой программы к строке, состоящей из 200 цифр 7, 12 цифр 2, 87 цифр 9, идущих в произвольном порядке. В ответе запишите количество двоек в полученной строке.
Решение руками
Нам будут выгодны строки, в которых девятка стоит перед каждой группой из 3 семёрок, затем оставшиеся девятки, затем оставшиеся семерки и в конце двойки. Взглянем на программу, чтобы выяснить, почему так: при замене 3 семерок мы получаем 922, вспоминаем, что перед каждой группой семерок стоит девятка, тогда этот блок будет выглядеть так 9922, каждая пара девяток будет заменена на 1 двойку, тогда в результате получим 222, следовательно каждый элемент 9777 будет заменен на 222.
Решение программой
s = ’9777’ * 66 + ’9’ * 21 + ’7’ * 2 + ’2’ * 12 while ’777’ in s or ’99’ in s: if ’777’ in s: s = s.replace(’777’, ’922’, 1) else: s = s.replace(’99’, ’2’, 1) print(s.count(’2’))
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в которых v и w обозначают последовательности цифр.
А) заменить (v,w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (121, 3) преобразует строку 112112 в строку 1312.
Если в строке нет вхождений последовательности v, то выполнение команды не изменяет исходную строку.
Б) Нашлось (v).
Эта команда проверяет, встречается ли последовательность v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА нашлось (90) или нашлось (09)
ЕСЛИ нашлось (90)
ТО заменить (90,090)
ИНАЧЕ
заменить (09, 9)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход программы поступает строка из n цифр, содержащая равное количество цифр 0, 9, расположенных в произвольном порядке. При каком минимальном значении n в строке, полученной в результате работы программы, количество цифр 9 будет больше 40?
mn = 10**10 for n in range(100): s = ’0’*n+’9’*n while ’90’ in s or ’09’ in s: if ’90’ in s: s = s.replace(’90’, ’090’, 1) else: s = s.replace(’09’, ’9’, 1) if s.count(’9’) > 40: mn = min(mn, n) break # В программе n это кол-во одного типа цифр. # В условии задачи n — общее кол-во цифр. # Поэтому значение умножаем на 2. print(mn*2)
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в которых v и w обозначают последовательности цифр.
А) заменить (v,w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (121, 3) преобразует строку 112112 в строку 1312.
Если в строке нет вхождений последовательности v, то выполнение команды не изменяет исходную строку.
Б) Нашлось (v).
Эта команда проверяет, встречается ли последовательность v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА нашлось (31) или нашлось (34)
заменить (31, 443)
заменить (34, 13)
КОНЕЦ ПОКА
КОНЕЦ
Известно, что исходная строка начиналась и заканчивалась тройкой, а в середине содержала только единицы и четверки в произвольном порядке. После выполнения данной программы получилась строка, содержащая 33 единицы и 40 четверок. Сколько единиц и четверок в сумме было в исходной строке?
Порядок единиц и четвёрок неважен здесь, так как в любом случае подстроки будут поочерёдно меняться одно и то же кол-во раз. Суть здесь в сдвиге тройки в начале строки, которая перемещается при любой замене к концу строки.
for n in range(100): for m in range(100): s = ’3’ + n*’1’ + m*’4’ + ’3’ while ’31’ in s or ’34’ in s: s = s.replace(’31’, ’443’, 1) s = s.replace(’34’, ’13’, 1) if s.count(’1’) == 33 and s.count(’4’) == 40: print(n+m)
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в которых v и w обозначают последовательности цифр.
А) заменить (v,w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (121, 3) преобразует строку 112112 в строку 1312.
Если в строке нет вхождений последовательности v, то выполнение команды не изменяет исходную строку.
Б) Нашлось (v).
Эта команда проверяет, встречается ли последовательность v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА нашлось (12) ИЛИ нашлось (13)
ЕСЛИ нашлось (12) ТО заменить (12, 48)
КОНЕЦ ЕСЛИ
ЕСЛИ нашлось (13) ТО заменить (13, 568)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход программы, приведенной выше, поступает строка, начинающаяся с цифры ”1” , а затем содержащая m цифр ”2” и m цифр ”3”, расположенных в произвольном порядке. Определите наименьшее значение m, при котором сумма числовых значений цифр строки, получившейся в результате выполения программы, делится на 23 без остатка.
for m in range(1, 100): s = ’1’ + m*’3’ + m*’2’ while ’12’ in s or ’13’ in s: if ’12’ in s: s = s.replace(’12’, ’48’, 1) if ’13’ in s: s = s.replace(’13’, ’568’, 1) sum = 0 for i in range(len(s)): sum += int(s[i]) if sum % 23 == 0: print(m)
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразует её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды заменить (111, 27) преобразует строку 05111150 в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Дана программа для редактора:
НАЧАЛО
ПОКА НЕ нашлось (00)
заменить (012, 30)
ЕСЛИ нашлось (011)
ТО
заменить (011, 20)
заменить (022, 40)
ИНАЧЕ
заменить (01, 10)
заменить (02, 101)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Известно, что исходная строка A содержала ровно два нуля – на первом и на последнем месте, а также по 10 единиц и двоек. После выполнения данной программы получилась строка B, содержащая 7 единиц и 5 двоек. Какое наименьшее количество троек может быть в строке B?
Быстрое решение прогой (пишем свой Product, в котором сразу отсекаются варианты, где единиц или двоек больше, чем 10). Поэтому, вариантов всех строк, где есть два нуля и количество единиц и двоек равное 10 совсем небольшое для дальнейшего перебора (т.к. мы сразу ищем нужные варианты).
def f(s = ’’, l = 0, c1 = 0, c2 = 0): if l == 20 and c1 == 10 and c2 == 10: return s x, y = ’’, ’’ if c1 <= 9: x = f(s + ’1’, l + 1, c1 + 1, c2) if c2 <= 9: y = f(s + ’2’, l + 1, c1, c2 + 1) return x + ’ ’ + y a = f().split() b = [] minim = 10000000 for i in a: s = ’0’ + i + ’0’ while not ’00’ in s: s = s.replace(’012’, ’30’, 1) if ’011’ in s: s = s.replace(’011’, ’20’, 1) s = s.replace(’022’, ’40’, 1) else: s = s.replace(’01’, ’10’, 1) s = s.replace(’02’, ’101’, 1) if s.count(’1’) == 7 and s.count(’2’) == 5: minim = min(minim, s.count(’3’)) print(minim)
Ошибка.
Попробуйте повторить позже
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов.
1. заменить (v, w)
2. нашлось (v)
Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор.
Дана программа для исполнителя Редактор:
НАЧАЛО
ПОКА нашлось(01) ИЛИ нашлось(02) ИЛИ нашлось(03)
заменить(01, 2302)
заменить(02, 10)
заменить(03, 201)
КОНЕЦ ПОКА
КОНЕЦ
Известно, что исходная строка начиналась с нуля, а далее содержала только единицы, двойки и тройки расположенные в произвольном порядке. После выполнения данной программы получилась строка, содержащая 51 единицу, 29 двоек и 23 тройки. Сколько троек было в исходной строке?
Аналитическое решение
Заметим, что при заменах комбинаций и
в результате получается комбинация, оканчивающаяся на
и
. Тогда можно расписать полную замену, с учётом нескольких команд сразу. Получится следующий
результат:
Пусть в исходной строке было единиц, двоек и троек соответственно. Тогда будет выполнено
переходов
,
и
. Получится, что в конечном выражении все переходы
дают по одной единице, двойки дают переходы
(причем один переход
даёт две двойки), тройки дают переходы
. Тогда получим следующую систему
уравнений:
Решив систему из этих трёх уравнений получим одно решение — , то есть количество троек в исходном
выражении равно 6.
Решение программой
# Будем перебирать количество единиц, двоек и троек for c1 in range(100): for c2 in range(100): for c3 in range(100): s = ’0’ + c1 * ’1’ + c2 * ’2’ + c3 * ’3’ # Порядок цифр для алгоритма не важен # Осуществляем алгоритм while (’01’ in s) or (’02’ in s) or (’03’ in s): s = s.replace(’01’, ’2302’, 1) s = s.replace(’02’, ’10’, 1) s = s.replace(’03’, ’201’, 1) # Проверка, что в итоге получается строка, соответствующая условию if (s.count(’1’) == 51) and (s.count(’2’) == 29) and (s.count(’3’) == 23): print(c3) # Вывод ответа, после этого нужно остановить программу
Ошибка.
Попробуйте повторить позже
Исполнитель Лошадка получает на вход строку цифр и преобразовывает её. Лошадка может выполнять две команды, в обеих командах v и w обозначают цепочки символов.
1. заменить (v, w)
2. нашлось (v)
Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Лошадка. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь».
Дана программа для исполнителя Лошадка:
НАЧАЛО
ПОКА нашлось (*2) ИЛИ нашлось (*6) ИЛИ нашлось (*7)
ЕСЛИ нашлось (*2)
ТО заменить (*2, *767)
ИНАЧЕ ЕСЛИ нашлось (*6)
ТО заменить (*6, *)
ИНАЧЕ ЕСЛИ нашлось (*7)
ТО заменить (*7, 3*)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход приведённой программе поступает строка, начинающаяся с символа «*», а затем содержащая 20 цифр 2, 100 цифр 6 и 42 цифры 7, расположенных в произвольном порядке. Определите сумму числовых значений цифр строки, получившейся в результате выполнения программы. Так, например, если результат работы программы представлял бы собой строку, состоящую из 50 цифр 2, то верным ответом было бы число 100.
s = ’*’ + ’2’*20 + ’6’*100 + ’7’*42 while ’*2’ in s or ’*6’ in s or ’*7’ in s: if ’*2’ in s: s = s.replace(’*2’, ’*767’, 1) elif ’*6’ in s: s = s.replace(’*6’, ’*’, 1) elif ’*7’ in s: s = s.replace(’*7’, ’3*’, 1) print(s.count(’7’) * 7 + s.count(’6’) * 6 + s.count(’3’) * 3)