Исполнитель Редактор

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


Ответы (1 шт):

Автор решения: Zhihar

если я правильно понял алгоритм, то код выглядит так:

i = 300
while True:
    i += 1

    text = '5' * i

    while '555' in text or '888' in text:
        index = text.find('555')
        text = text if index == -1 else (text[:index] + '8' + text[index + 3:])

        index = text.find('888')
        text = text if index == -1 else (text[:index] + '55' + text[index + 3:])


    count5 = text.count('5')
    count8 = text.count('8')

    if count5 > count8:
        print(i)
        break

и ответ 303

чисто теоретически опять таки можно решить следующим образом:

очевидно, что с заменой только слева направо подстрок мы можем получить только следующие варианты:

855
8
885
85
88
8855
55

(не возможны варианты типа 858..., потому что меняем цифры строго слева направо и не возможен вариант '5' - его неоткуда сформировать (ведь '888' всегда меняется строго на '55')

из которых по условию нас устраивает только 855 и 55 (кол-во восьмерок и пятерок от 0 до 2 определяется как раз тем, что мы заменяем тройки этих цифр, т.е. модель по 3)

как несложно понять все приведённые выше строки будут повторяться с периодом 7

теперь, когда у нас есть периодичность начнем с самого нуля - рассмотрим строки от 1 символа и выше:

строка '5' нам не подходит - ее нет среди 7 возможных вариантов

берем следующую строку '55' - ее размер 2, теперь осталось решить задачу

2 + 7 * x > 300

откуда

x = 47
2 + 7 * 47 = 303

задача решена не прибегая к программированию

→ Ссылка