Тема 21. Теория игр

21. Теория игр

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#38807

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Из предыдущих заданий мы знаем, что в значениях 14  , 15  Петя гарантированно побеждает своим вторым ходом и в отрезке значений [17;49] Петя побеждает гарантированно своим первым ходом. Значение, из которого ВСЕ первые ходы ведут в вышеописанные значения – это значение, в котором Ваня гарантированно побеждает вторым ходом или первым при неудачной игре Пети. Распишем значение и стратегии, при которых Ваня побеждает вторым или первым ходом:

S = 13  . Петя может увеличить количество камней до 14  , 15  или 39  . В первых двух случаях, Ваня выиграет вторым ходом. В оставшемся случае, Ваня победит первым ходом.

Ответ: 13

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 50: # если камней в куче стало больше 49
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_heap*3)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,50):
    if game(i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    return h + 1, h + 2, h * 3


@lru_cache(None)
def f(h):
    if (h >= 50):
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’P1’
    if all(f(x) == ’P1’ for x in moves(h)):
        return ’V1’
    if any(f(x) == ’V1’ for x in moves(h)):
        return ’P2’
    if all(f(x) == ’P1’ or f(x) == ’P2’ for x in moves(h)):
        return ’V2’


for s in range(1,50):
    if f(s) == ’V2’:
        print(s)

Ответ: 13

Ошибка.
Попробуйте повторить позже

Задача 2#14229

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

Рассмотрим S = 4  и стартовую позицию (4,4)  .

Если Петя домножит первую кучу на 2 и получит позицию (8,4)  , то Ваня своим первым ходом поставит Петю в позицию (8,8)  , увеличив вторую кучу в 2 раза. Из позиции (8,8)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 8+ 8⋅2 = 24  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2.

Если Петя домножит вторую кучу на 2 и получит позицию (4,8)  , то Ваня своим первым ходом поставит Петю в позицию (8,8)  , и снова выиграет своим вторым ходом, умножив большую кучу на 2.

Если Петя добавит 1 камень в первую кучу и получит позицию (5,4)  , то Ваня своим первым ходом поставит Петю в позицию (10,4)  , увеличив первую кучу в 2 раза. Из позиции (10,4)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 10 ⋅2+ 4 = 24  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2.

Если Петя добавит 1 камень во вторую кучу и получит позицию (4,5)  , то Ваня своим первым ходом поставит Петю в позицию (4,10)  , и снова выиграет своим вторым ходом, умножив большую кучу на 2.

Решение БУ

from functools import lru_cache


@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 25:  # Если камней в куче стало больше 25
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win:
        return -max(petya_win) + 1  # Выигрышный ход Пети
    else:
        return -max(moves)  # Выигрышный ход Вани


# Поиск минимального значения S для выигрыша Вани
for s in range(1, 21):
    if game(4, s) == -2:
        print(s)  # Вывод минимального значения S
        break

Решение АР

from functools import lru_cache
def moves(h):
    a, b = h
    return (a + 1, b), (a, b + 1), (a * 2, b), (a, b * 2)
@lru_cache(None)
def f(h):
    if (sum(h) >= 25):
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’P1’
    if all(f(x) == ’P1’ for x in moves(h)):
        return ’V1’
    if any(f(x) == ’V1’ for x in moves(h)):
        return ’P2’
    if all(f(x) == ’P1’ or f(x) == ’P2’ for x in moves(h)):
        return ’V2’
for s in range(1, 21):
    h = 4, s
    if f(h) == ’V2’:
        print(s)
        break

Ответ: 4

Ошибка.
Попробуйте повторить позже

Задача 3#14232

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

В прошлой задаче Петя получает из позиции (6,S)  позицию (6,12)  , он может получить ее так: 4⋅3 = 12  или 10 +2 = 12  . Значит, при S = 10  Петя гарантированно выигрывает первым или вторым ходом независимо от игры Вани. Рассмотрим S = 9  и стартовую позицию (6,9)  .

Если Петя домножит первую кучу на 3 и получит позицию (18,9)  , то Ваня выиграет своим первым ходом, умножив первую кучу на 3 и получив позицию (54,9)  .

Если Петя домножит вторую кучу на 3 и получит позицию (6,27)  , то Ваня выиграет своим первым ходом, умножив вторую кучу на 3 и получив позицию (6,81)  .

Если Петя добавит 2 камня в первую кучу и получит позицию (8,9)  , то Ваня своим первым ходом поставит Петю в позицию (8,11)  , добавив 2 камня во вторую кучу. Из позиции (8,11)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 8 + 11⋅3 = 41  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 3.

Если Петя добавит 2 камня во вторую кучу и получит позицию (6,11)  , то Ваня своим первым ходом поставит Петю в позицию (8,11)  и так же, как в предыдущем случае, гарантированно выиграет своим вторым ходом.

Решение БУ

from functools import lru_cache


@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 43:  # Если камней в куче стало больше 43
        return 0  # Прекращаем игру
    moves = [game(first_heap + 2, second_heap), game(first_heap, second_heap + 2), game(first_heap * 3, second_heap),
             game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win:
        return -max(petya_win) + 1  # Выигрышный ход Пети
    else:
        return -max(moves)  # Выигрышный ход Вани


# Поиск минимального значения S для выигрыша Вани
for s in range(1, 37):
    if game(6, s) == -2:
        print(s)  # Вывод минимального значения S
        break

Ответ: 9

Ошибка.
Попробуйте повторить позже

Задача 4#14235

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

В прошлой задаче петя получает из позиции (4,S)  позицию (4,12)  , он может получить ее так: 6 ⋅2 = 12  или 9 + 3 = 12  . Значит, при S = 9  Петя гарантированно выигрывает первым или вторым ходом независимо от игры Вани. Рассмотрим S = 8  и стартовую позицию (4,8)  .

Если Петя домножит первую кучу на 2 и получит позицию (8,8)  , то Ваня своим первым ходом поставит Петю в позицию (11,8)  , увеличив первую кучу в 2 раза. Из позиции (11,8)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 11 ⋅2+ 8 = 30  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2.

Если Петя домножит вторую кучу на 2 и получит позицию (4,16)  , то Ваня выиграет своим первым ходом умножив вторую кучу на 2, и получив позицию (4;32)  .

Если Петя добавит 3 камня в первую кучу и получит позицию (7,8)  , то Ваня своим первым ходом поставит Петю в позицию (7,11)  , добавив во вторую кучу 3 камня. Из позиции (7,11)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 7 + 11⋅2 = 29  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2.

Если Петя добавит 3 камня во вторую кучу и получит позицию (4,11)  , то Ваня своим первым ходом поставит Петю в позицию (8,11)  , и снова выиграет своим вторым ходом, умножив большую кучу на 2.

Решение БУ

from functools import lru_cache


@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 31:  # Если в двух кучах камней больше или равно 31
        return 0  # Прекращаем игру
    moves = [game(first_heap + 3, second_heap), game(first_heap, second_heap + 3), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win:
        return -max(petya_win) + 1  # Выигрышный ход Пети
    else:
        return -max(moves)  # Выигрышный ход Вани


# Поиск значения S для выигрыша Вани
for s in range(1, 27):
    if game(4, s) == -2:
        print(s)  # Вывод минимального значения S
        break

Ответ: 8

Ошибка.
Попробуйте повторить позже

Задача 5#14238

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Рассмотрим S = 36  и стартовую позицию (23,36)  .

Если Петя домножит первую кучу на 2 и получит позицию (46,36)  , то Ваня выиграет своим первым ходом, умножив первую кучу на 2 и получив позицию (92,36)  .

Если Петя домножит вторую кучу на 2 и получит позицию (23,72)  , то Ваня выиграет своим первым ходом, умножив вторую кучу на 2 и получив позицию (23,144)  .

Если Петя добавит 1 камень в первую кучу и получит позицию (24,36)  , то Ваня своим первым ходом поставит Петю в позицию (24,37)  , добавив во вторую кучу 1 камень. Из позиции (24,37)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 24 + 37⋅2 = 98  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2.

Если Петя добавит 1 камень во вторую кучу и получит позицию (23,37)  , то Ваня своим первым ходом поставит Петю в позицию (24,37)  , и снова выиграет своим вторым ходом, умножив большую кучу на 2.

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 99:  # Если камней в куче стало больше 98
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,76):
    if game(23,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Ответ: 36

Ошибка.
Попробуйте повторить позже

Задача 6#14241

Для игры, описанной ранее, найдите такое максимальное значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Рассмотрим S = 23  и стартовую позицию (5,23)  .

Если Петя домножит первую кучу на 3 и получит позицию (15,23)  , то Ваня выиграет своим первым ходом, умножив вторую кучу на 3 и получив позицию (15,69)  .

Если Петя домножит вторую кучу на 3 и получит позицию (5,69)  , то Ваня выиграет своим первым ходом, умножив вторую кучу на 3 и получив позицию (5,207)  .

Если Петя добавит 2 камня в первую кучу и получит позицию (7,23)  , то Ваня своим первым ходом поставит Петю в позицию (7,25)  , добавив во вторую кучу 2 камня. Из позиции (7,25)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 7 + 25⋅3 = 82  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2.

Если Петя добавит 2 камня во вторую кучу и получит позицию (5,25)  , то Ваня своим первым ходом поставит Петю в позицию (7,25)  , и снова выиграет своим вторым ходом, умножив большую кучу на 2.

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 84:  # Если камней в куче стало больше 83
        return 0  # Прекращаем игру
    moves = [game(first_heap + 2, second_heap), game(first_heap, second_heap + 2), game(first_heap * 3, second_heap),
             game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,79):
    if game(5,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Ответ: 23

Ошибка.
Попробуйте повторить позже

Задача 7#16209

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Крабового есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Оливье;

– у Крабового нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

Рассмотрим S = 14  .

Если Оливье добавит 1  камень в кучу и получит позицию S = 15  , то Крабовый своим первым ходом поставит Оливье в позицию S = 16  , добавив в кучу 1  камень. Из позиции S = 16  ни один шаг не приведет Оливье к победе (максимальная сумма, которую может получить Оливье, равна 16 ⋅2 = 32  ), но любой его шаг ставит Крабовый в позицию, из которой Крабовый выигрывает своим вторым ходом, умножив большую кучу на 2  .

Если Оливье домножит кучу на 2  и получит позицию S = 28  , то Крабовый выигрывает своим первым ходом, умножив кучу на 2  .

Решение БУ

#Петя - Оливье
#Ваня - Крабовый
def game(first_heap): # функция игры
    if first_heap >= 33: # если камней в куче стало больше 32
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap*2)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,33):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)



Решение АР

from functools import lru_cache


def moves(h):
    return h + 1, h * 2


@lru_cache(None)
def f(h):
    if h >= 33:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    if any(f(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    if all(f(x) == ’WIN1’ or f(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’


for i in range(1, 33):
    if f(i) == ’LOSE2’:
        print(i)

Ответ: 14

Ошибка.
Попробуйте повторить позже

Задача 8#16212

Для игры, описанной ранее, найдите такое максимальное значение S  , при котором одновременно выполняются два условия:

– у Крабового есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Оливье;

– у Крабового нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

Рассмотрим S = 18  .

Если Оливье добавит 1  камень в кучу и получит позицию S = 19  , то Крабовый своим первым ходом поставит Ольвье в позицию S = 20  , добавив в кучу 1  камень. Из позиции S = 20  ни один шаг не приведет Ольвье к победе (максимальная сумма, которую может получить Оливье, равна 20 ⋅2 = 40  ), но любой его шаг ставит Крабовый в позицию, из которой Крабовый выигрывает своим вторым ходом, умножив большую кучу на 2  .

Если Оливье добавит 3  камня в кучу и получит позицию S = 21  , то Крабовый выигрывает своим первым ходом, умножив кучу на 2  .

Если Оливье домножит кучу на 2  и получит позицию S = 36  , то Крабовый выигрывает своим первым ходом, умножив кучу на 2  .

Решение БУ

#Петя - Оливье
#Ваня - Крабовый

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 42: # если камней в куче стало больше 41
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap*2),game(first_heap + 3)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,42):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    return h + 1, h + 3, h * 2


@lru_cache(None)
def f(h):
    if h >= 42:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    if any(f(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    if all(f(x) == ’WIN1’ or f(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’


for i in range(42, 1, -1):
    if f(i) == ’LOSE2’:
        print(i)
        break

Ответ: 18

Ошибка.
Попробуйте повторить позже

Задача 9#16215

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Крабового есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Оливье;

– у Крабового нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

Рассмотрим S = 40  .

Если Оливье уберет 1  камень из кучи и получит позицию S = 39  , то Крабовый своим первым ходом поставит Оливье в позицию S = 37  , убрав из кучи 2  камня. Из позиции S = 37  ни один шаг не приведет Оливье к победе, но любой его шаг ставит Крабовый в позицию, из которой Крабовый выигрывает своим вторым ходом, убрав из кучи 2  камня.

Если Оливье уберет 2  камня из кучи и получит позицию S = 38  , то Крабовый своим первым ходом поставит Оливье в позицию S = 37  , убрав из кучи 1  камня. Из позиции S = 37  ни один шаг не приведет Оливье к победе, но любой его шаг ставит Крабовый в позицию, из которой Крабовый выигрывает своим вторым ходом, убрав из кучи 2  камня.

Решение БУ

#Петя - Оливье
#Ваня - Крабовый

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap <= 34: # если камней в куче стало меньше 34
        return 0 # прекращаем игру
    moves = [game(first_heap-1),game(first_heap-2)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(36,100):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    return h - 1, h - 2


@lru_cache(None)
def f(h):
    if h <= 34:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    if any(f(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    if all(f(x) == ’WIN1’ or f(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’


for i in range(36, 100):
    if f(i) == ’LOSE2’:
        print(i)

Ответ: 40

Ошибка.
Попробуйте повторить позже

Задача 10#16218

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

Рассмотрим S = 14  и стартовую позицию (3,14)  .

Если Петя добавит 1 камень в первую кучу и получит позицию (4,14)  , то Ваня своим первым ходом поставит Петю в позицию (4,15)  , добавив во вторую кучу 1  камень. Из позиции (4,15)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 4 + 15⋅3 = 49  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 3  .

Если Петя добавит 1 камень во вторую кучу и получит позицию (3,15)  , то Ваня своим первым ходом поставит Петю в позицию (4,15)  , добавив в первую кучу 1  камень. Из позиции (4,15)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 4 + 15⋅3 = 49  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 3  .

Если Петя домножит первую кучу на 3  и получит позицию (9,14)  , то Ваня выиграет своим первым ходом умножив большую кучу на 3  .

Если Петя домножит вторую кучу на 3  и получит позицию (3,42)  , то Ваня выиграет своим первым ходом умножив большую кучу на 3  .

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 50:  # Если камней в куче стало больше 49
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 3, second_heap),
             game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,47):
    if game(3,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    a, b = h
    return (a + 1, b), (a, b + 1), (a * 3, b), (a, b * 3)


@lru_cache(None)
def f(h):
    if sum(h) >= 50:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    if any(f(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    if all(f(x) == ’WIN1’ or f(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’


for i in range(1, 47):
    h = i, 3
    if f(h) == ’LOSE2’:
        print(i)

Ответ: 14

Ошибка.
Попробуйте повторить позже

Задача 11#16221

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение руками

Рассмотрим S = 14  и стартовую позицию (12,14)  .

Если Петя домножит первую кучу на 2  и получит позицию (24,14)  , то Ваня выиграет своим первым ходом, умножив первую кучу на 2  .

Если Петя домножит вторую кучу на 2  и получит позицию (12,28)  , то Ваня выиграет своим первым ходом, умножив вторую кучу на 2  .

Если Петя добавит 2  камня в первую кучу и получит позицию (14,14)  , то Ваня своим первым ходом поставит Петю в позицию (14,16)  , добавив 2  камня во вторую кучу. Из позиции (14,16)  ни один шаг не приведет Петю к победе (максимальная сумма, которую может получить Петя, равна 14 + 16⋅2 = 46  ), но любой его шаг ставит Ваню в позицию, из которой Ваня выигрывает своим вторым ходом, умножив большую кучу на 2  .

Если Петя добавит 2 камня во вторую кучу и получит позицию (12,16)  , то Ваня своим первым ходом поставит Петю в позицию (14,16)  и так же, как в предыдущем случае, гарантированно выиграет своим вторым ходом.

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 48:  # Если камней в куче стало больше 47
        return 0  # Прекращаем игру
    moves = [game(first_heap + 2, second_heap), game(first_heap, second_heap + 2), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,35):
    if game(12,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    a, b = h
    return (a + 2, b), (a, b + 2), (a * 2, b), (a, b * 2)


@lru_cache(None)
def f(h):
    if sum(h) >= 48:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    if any(f(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    if all(f(x) == ’WIN1’ or f(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’


for i in range(1, 35):
    h = i, 12
    if f(h) == ’LOSE2’:
        print(i)

Ответ: 14

Ошибка.
Попробуйте повторить позже

Задача 12#19038

Для игры, описанной ранее, найдите такое минимальное значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Из предыдущих заданий мы знаем, что в значениях 17  , 18  Петя гарантированно побеждает своим вторым ходом и в отрезке [21;62] Петя побеждает своим первым ходом. Значение, из которого ВСЕ первые ходы ведут к вышеописанным значениям – это значение, где Ваня гарантированно выигрывает своим вторым ходом. Распишем значения и стратегии, где Ваня побеждает своим вторым ходом:

S = 15  . Петя может увеличить количество камней до 17  или до 45  . В первом случае, Ваня победит своим вторым ходом. Во втором случае, Ваня победит своим первым ходом.

S = 16  . Петя может увеличить количество камней до 18  или до 48  . В первом случае, Ваня победит своим вторым ходом. Во втором случае, Ваня победит своим первым ходом.

В ответ нужно указать минимальное значение S. Ответ: 15  .

Решение БУ


from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 63: # если камней в куче стало больше 62
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_heap*3)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,63):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)
        break

Ответ: 15

Ошибка.
Попробуйте повторить позже

Задача 13#19041

Для игры, описанной ранее, найдите такое минимальное значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Из предыдущих заданий мы знаем, что в значениях 15  , 27  , 29  Петя гарантированно побеждает своим вторым ходом и в отрезке значений [31;61] Петя гарантированно побеждает своим первым ходом. Значение, из которого ВСЕ первые ходы ведут в вышеописанные значения является значением, в котором Ваня гарантированно побеждает вторым ходом или первым ходом при неудачной игре Пети. Распишем значения и стратегии, при которых Ваня побеждает вторым или первым ходом:

S = 26  . Петя может увеличить количество камней до 27  , 29  или 52  . В первых двух случаях, Ваня гарантированно победит своим вторым ходом. В оставшемся случае, Ваня гарантированно победит своим первым ходом.

S = 28  . Петя может увеличить количество камней до 29  , 31  или 56  . В первых двух случаях, Ваня гарантированно победит своим вторым ходом. В оставшемся случае, Ваня гарантированно победит своим первым ходом.

В ответ нужно указать минимальное значение S. Ответ: 26

Решение БУ


from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 62: # если камней в куче стало больше 61
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+3),game(first_heap*2)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,62):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)
        break

Ответ: 26

Ошибка.
Попробуйте повторить позже

Задача 14#19044

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 38:  # Если камней в куче стало больше 37
        return 0  # Прекращаем игру
    moves = [game(first_heap + 2, second_heap), game(first_heap, second_heap + 2), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,33):
    if game(5,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)
# Таких значений нет, значит, в ответ указываем 0

Ответ: 0

Ошибка.
Попробуйте повторить позже

Задача 15#19047

Для игры, описанной ранее, найдите такие значения S  , при которых одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

В ответе запишите минимальное и максимальное найденное значение в порядке возрастания без пробелов и знаков препинания.

Показать ответ и решение

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 136:  # Если камней в куче стало больше 135
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 3, second_heap),
             game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,102):
    if game(34,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache
def moves(h):
    a, b = h
    return (a*3, b), (a+1, b), (a, b*3), (a, b+1)
@lru_cache(None)
def game(h):
    if sum(h) >= 136:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    elif all(game(x) == ’WIN2’ or game(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE2’
for s in range(1, 102):
    if game((34, s)) == ’LOSE2’:
        print(s)

Ответ: 1031

Ошибка.
Попробуйте повторить позже

Задача 16#19050

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 51:  # Если камней в куче стало больше 50
        return 0  # Прекращаем игру
    moves = [game(first_heap + 3, second_heap), game(first_heap, second_heap + 3), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2), game(first_heap + 2, second_heap), game(first_heap, second_heap + 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,46):
    if game(5,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache
def moves(h):
    a, b = h
    return (a*2, b), (a+2, b), (a+3, b), (a, b*2), (a, b+2), (a, b+3)
@lru_cache(None)
def game(h):
    if sum(h) >= 51:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(h)):
        return ’WIN2’
    elif all(game(x) == ’WIN2’ or game(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE2’
for s in range(1, 46):
    if game((5, s)) == ’LOSE2’:
        print(s)

Ответ: 18

Ошибка.
Попробуйте повторить позже

Задача 17#19194

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Из предыдущих заданий мы знаем, что в значениях 10  , 19  Петя гарантированно побеждает своим вторым ходом и в отрезке значений [21;41] Петя гарантированно побеждает своим первым ходом. Значение, из которого ВСЕ первые ходы ведут в вышеописанные значения – это значение, где Ваня гарантированно побеждает своим вторым ходом или первым ходом при неудачной игре Пети. Распишем значение и стратегии, при которых Ваня побеждает вторым или первым ходом:

S = 18  . Петя может увеличить количество камней до 19  или 36  камней. В первом случае, Ваня победит своим вторым ходом. Во втором случае, Ваня победит своим первым ходом.

Ответ: 18

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 42: # если камней в куче стало больше 41
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap*2)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,42):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)

Решение АР

from functools import lru_cache

def moves(heap):
    return heap + 1, heap * 2

@lru_cache(None)
def game(heap):
    if heap >= 42:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’

for s in range(1, 42):
    print(s, game(s))

Ответ: 18

Ошибка.
Попробуйте повторить позже

Задача 18#19197

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Показать ответ и решение

Решение руками

Из предыдущих заданий мы знаем, что в значениях 14  , 15  Петя гарантированно побеждает своим вторым ходом и в отрезке значений [17;49] Петя гарантированно побеждает своим первым ходом. Значение, из которого ВСЕ первые ходы ведут в вышеописанные значения – это значение, в котором Ваня гарантированно побеждает своим вторым ходом или первым ходом при неудачной игре Пети. Распишем значение и стратегии, при которых Ваня побеждает вторым или первым ходом:

S = 13  . Петя может увеличить количество камней до 14  , 15  или 39  . В первых двух случаях Ваня победит гарантированно своим вторым ходом. В оставшемся случае, Ваня победит своим первым ходом.

Ответ: 13

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 50: # если камней в куче стало больше 49
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_heap*3)] # прописываем ходы возможные в партии
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # проверяем есть ли выигрыш Пети в данной позиции
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,50):
    if game(i) == -2: # если в данной позиции Ваня побеждает вторым ходом
        print(i)

Решение АР

from functools import lru_cache

def moves(heap):
    return heap + 1, heap + 2, heap * 3

@lru_cache(None)
def game(heap):
    if heap >= 50:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’

for s in range(1, 50):
    print(s, game(s))

Ответ: 13

Ошибка.
Попробуйте повторить позже

Задача 19#19200

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0  .

Показать ответ и решение

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 33:  # Если камней в куче стало больше 32
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 2, second_heap),
             game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,29):
    if game(4,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache

def moves(heap):
    a, b = heap
    return (a + 1, b), (a, b + 1), (a * 2, b), (a, b * 2)

@lru_cache(None)
def game(heap):
    if sum(heap) >= 33:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’

for s in range(1, 29):
    print(s, game((4, s)))

Ответ: 11

Ошибка.
Попробуйте повторить позже

Задача 20#19203

Для игры, описанной ранее, найдите такое значение S  , при котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Если такого значения нет, в ответ запишите 0.

Показать ответ и решение

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 99:  # Если камней в куче стало больше 98
        return 0  # Прекращаем игру
    moves = [game(first_heap + 2, second_heap), game(first_heap, second_heap + 2), game(first_heap * 3, second_heap),
             game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,94):
    if game(5,i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache

def moves(heap):
    a, b = heap
    return (a + 2, b), (a, b + 2), (a * 3, b), (a, b * 3)

@lru_cache(None)
def game(heap):
    if sum(heap) >= 99:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’

for s in range(1, 94):
    print(s, game((5, s)))

Ответ: 28
Рулетка
Вы можете получить скидку в рулетке!