Перед тем как решать заданий 19-21 ЕГЭ по информатике с помощью Python, предварительно поговорим о некоторых навыках программирования (небольшой ликбез).
Использовании собственных функций в Python
Функции удобны тем, что можно определенному коду дать имя (имя функции) и не писать этот код повторно, а обращаться к нему по заданному имени.
Функции могут получать аргументы (обновляемые переменные, которые используется внутри функции) и могут возвращать результат работы.
В Python функцию можно создать с помощью инструкции def, а return возвращает результат и прекращает выполнение функции. Описание функции должно быть выше по коду, чем вызов этой функции.
Стоит добавить, что внутри функции можно вновь обратиться к этой же самой функции. Python создаст новый экземпляр нашей функции, и эти экземпляры будут работать независимо друг от друга (каждый со своими параметрами). Такой прием в программировании называется рекурсией.
Функции Any() и All()
В Python есть две удобные функции Any() и All(). Поймём как они работают.
Функция any() принимает итерируемый объект (то, что можно перебирать) и возвращает Истина (True) при условии, что хотя бы один из элементов является Истина (True).
Функция all() принимает итерируемый объект и возвращает Истина (True) при условии, что все элементы будут Истина (True).
Если коротко, то Any() перебирает все значения, пока не найдет первое Истина,
All(), наоборот, перебирает все, пока не найдет False. Проще понять на примере:
Функция range (start, end, step) задаёт диапазон чисел от start до end с шагом step.
Код решения
В заданиях 19-21 спрашивается изначальное количество камней, при которых возможна описываемая ситуация. Следовательно, все ответы даются относительно первого игрока. По условию задачи нужно определить, где находится игрок Петя (на каком холме или в какой яме).
Если непонятно причём здесь холмы и ямы, то следует прочитать предыдущую статью.
Для ответа на задание 19 нужно определить минимальное число камней для первой ямы.
Для ответа на задание 20 нужно определить минимальные числовые значения холма, и это не может быть холм 1 .Так как код выполняется очень долго (из-за рекурсии). Чтобы его ускорить нужно добавить кэширование функции. Для этого используются декоратор lru_cache модуля functools перед функцией game:
import functools - в начале программы
@functools.lru_cache(None) - перед def game(s):
А для ответа на задание 21 надо определить минимальное число второй ямы.
Как видите, несмотря на то что в ЕГЭ теория игр занимает три задания, по факту работает один и тот же код с небольшими дополнениями.