«Этот лис, кажется, и за человека меня не считает», – подумал Нильс и что было силы дёрнул лиса за хвост. От неожиданности Смирре выпустил гуся. Всего только на секунду. Гусь рванулся вверх и, тяжело взмахивая помятыми крыльями, полетел к озеру.
– Ах, так Смирре. – Ну, ладно же!
И Смирре попробовал было схватить Нильса. Но это было не так-то легко – Нильс крепко, обеими руками, держался за его хвост.
Смирре прыгнул вправо, а хвост повернулся влево.
Смирре прыгнул влево, а хвост повернулся вправо.
Смирре кружился, как волчок, но и хвост кружился вместе с ним, а вместе с хвостом и Нильс.
Напишите функцию circle_tail(), которая будет определять, за кем победа в каждом раунде.
Для этого нужно для каждой введенной строки находить символы, которые в этой строке встречаются в словах до разделителя ##, но не встречаются после него.
Функция может принимать произвольное число аргументов-строк и произвольное число именованных аргументов.
Если именованные аргументы не переданы, то функция просто возвращает список кортежей, в которых для каждой строки определены: (суммарное количество слов в каждой части строки, символы, которые встречаются в словах первой части, но не встречаются в словах второй).
Если передан именованный аргумент in_order и он имеет значение True, то кортежи в списке, а также буквы в кортеже, должны быть упорядочены по возрастанию. Если значение False, то по убыванию.
Если передан именованный параметр shift, то сначала всю строку нужно сдвинуть влево на количество позиций, равное значению этого аргумента (то есть столько символов из начала строки переставить в конец).
Ввод
data = ['This Fox does not even seem to think##I am human', 'Nils thought##pulled the Foxs tail as hard as he could', 'In surprise Smirre released the goose.##Just for a second.']
print(*circle_tail(*data), sep="\n")
Вывод
(11, 'vFsextTiokd')
(11, 'gN')
(10, 'mlSghpiI')
22
Объяснение:
Понятно, что каждая из команд может только увеличить число.
У нас обязательно есть число 16, из него есть два пути:
1. сделать +1
2. сделать x2
Если мы сделаем +1, то после этого уже точно не сможем сделать x2, т.к. 17 x 2 = 34, а 34 > 33, а уменьшить число мы не сможем. Если мы будем делать постоянно +1, то мы точно пройдём через 30.
Значит не нужно делать +1, когда мы на числе 16, а надо делать x2.
Следовательно, концовка у нас точно будет такая 16 -> 32 -> 33.
Теперь надо посчитать, сколько различных получить 16 из 2. К любому такому мы допишем нашу концовку и получим программу подходящую под наши условия, и к тому же все программы, подходящие под данные условия, выглядят именно так.
Считать сколькими можно получить 16 из 2 будет динамическим программированием.
ans[i] - количество различных программ, которые получают i из 2.
Очевидно, ans[2] = 1 (пустая программа).
ans[3] = 1 (нужно сделать +1)
ans[4] = ans[3] + ans[2] = 2 (можно сделать +1 к 3, а можно x2 к 2)
Далее вычисления всегда следующие:
ans[i] = ans[i - 1] + ans[i / 2] для чётных i (можно либо добавить +1 к числу i - 1, либо сделать x2 для числа i / 2)
ans[i] = ans[i - 1] для нечётных i (можно получить только путём добавления +1 к числу i - 1)
Итак, считаем:
ans[2] = 1
ans[3] = ans[2] = 1
ans[4] = ans[3] + ans[2] = 2
ans[5] = ans[4] = 2
ans[6] = ans[5] + ans[3] = 4
ans[7] = ans[6] = 4
ans[8] = ans[7] + ans[4] = 6
ans[9] = ans[8] = 6
ans[10] = ans[9] + ans[5] = 8
ans[11] = ans[10] = 8
ans[12] = ans[11] + ans[6] = 12
ans[13] = ans[12] = 12
ans[14] = ans[13] + ans[7] = 16
ans[15] = ans[14] = 16
ans[16] = ans[15] + ans[8] = 22
Значит 16 из 2 можно получить И столькими же можно получить 33 из 2 выполняя условия задачи.