Задача к ЕГЭ по информатике на тему «исполнитель «редактор» – известная строка» №5

Исполнитель Панцирь получает на вход строку цифр и преобразовывает её. Панцирь может выполнять две команды, в обеих командах v и w обозначают цепочки символов.

1. заменить (v, w)

2. нашлось (v)

Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Панцирь. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь».

Дана программа для исполнителя Панцирь:

НАЧАЛО

   ПОКА нашлось(11)  ИЛИ нашлось(2)

      ПОКА нашлось(12)

         ТО заменить(12, 11)

      КОНЕЦ ПОКА

      ЕСЛИ нашлось(11)

         ТО заменить(11, 2)

      ИНАЧЕ ЕСЛИ нашлось(2)

         ТО заменить(2, 0)

      КОНЕЦ ЕСЛИ

   КОНЕЦ ПОКА

КОНЕЦ

Найдите произведение количества тех цифр, которых больше всего, и значения тех цифр, которых меньше всего в строке, полученной в результате применения приведённой выше программы к строке: 1◟1..◝.◜11◞ 2◟2..◝.◜22◞.   231      70  Так, если программа вывела бы 60 пятерок и 10 четверок, то ответом было число 60 ⋅ 4 = 240.

Аналитическое решение

Для удобства будем использвовать следующие обозначения для количества одинаковых цифр, идущих подряд: A   ,  (B)  где A – цифра, которая находится в строке, а B – количество этих цифр.

Изначально была строка 1(231)2(70).  Цикл ПОКА внутри основного цикла ПОКА будет работать до момента исчезновения всех двоек, таким образом после выполнения этого цикла строка будет состоять из 301 единицы.

Далее все кроме последней единицы исчезнут, а на их месте появятся двойки.

1(301) → 2(150)1(1)

После этого все двойки заменятся нулями и программа завершит свою работу. В полученной строке 150 нулей и 1 единица. Больше всего нулей, меньше – единиц, ответ 150 ⋅ 1 = 150

Решение программой

s = 231 * ’1’ + 70 * ’2’  # Получаем строку
# Осуществляем алгоритм
while (’11’ in s) or (’2’ in s):
    while ’12’ in s:
        s = s.replace(’12’, ’11’, 1)
    if ’11’ in s:
        s = s.replace(’11’, ’2’, 1)
    elif ’2’ in s:
        s = s.replace(’2’, ’0’, 1)

maxCount = 0  # Максимальное количество цифр
digit = ’’  # Цифра, которая больше всего раз встречается в строке
for d in set(s):  # Перебор цифр (без повторений)
    if s.count(d) > maxCount:
        maxCount = s.count(d)
        digit = d

# Теперь нужно maxCount умножить на значения цифр, кроме digit
for d in set(s):
    if d != digit:
        maxCount *= int(d)  # Умножаем на числовое значение цифры

print(maxCount)  # Выводим результат

Ответ: 150
Оцените статью
Я решу все!