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

21. Теория игр

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

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

Задача 41#23692Максимум баллов за задание: 1

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

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 49:  # Если камней в куче стало больше 48
        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,44):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(5,i) == -2:
        print(i)

Ответ: 13

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

Задача 42#23695Максимум баллов за задание: 1

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

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

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

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

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

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

Сделаем у области K2 : W 20  жирные границы, скопируем ее в AC2  : AO20  , AC22 : AO40  , AC42 : AO60  и AC62  : AO80  . В ячейках Y 2 : AA2  будет старт, в ячейках столбцов AC : AE  — ходы P 1  , в столбцах AG  : AI  — ходы V 1  , в AK : AM  P2  , в AO  V 2  . Напишем формулы в столбце P1  (в остальных столбцах они уже написаны). Перебирая значения старта (ячейка Z2  ) видим ответ 29  .

 

Программное решение:

from functools import lru_cache


@lru_cache(None)
def f(a, b):
    if a + b <= 34:
        return 0
    moves = []
    if a > 0:
        moves.append(f(a - 1, b))
        moves.append(f(a // 2, b))
    if b > 0:
        moves.append(f(a, b - 1))
        moves.append(f(a, b // 2))
    pinki_win = [i for i in moves if i <= 0]
    if pinki_win:
        return -max(pinki_win) + 1
    else:
        return -max(moves)


for i in range(12, 100):
    if f(22, i) == -2:
        print(i)

Ответ: 29

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

Задача 43#23698Максимум баллов за задание: 1

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

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

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

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

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

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

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 33: # если камней в куче стало больше 32
        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,33):
    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 game(h):
    if h >= 33:
        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, 33):
    if game(s) == "LOSE2":
        print(s)

Ответ: 12

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

Задача 44#23701Максимум баллов за задание: 1

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

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

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

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

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

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

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

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

Ответ: 20

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

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 46: # если камней в куче стало больше 45
        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,45):
    if game(i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Ответ: 20

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

Задача 45#23704Максимум баллов за задание: 1

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

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

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

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

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

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

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

Ответ: 15

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 38: # если камней в куче стало больше 37
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),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,38):
    if game(i) == -2: # если в данной позиции возможен выигрыш Вани вторым ходом
        print(i)

Решение АР

from functools import lru_cache
def moves(heap):
    return heap + 1, heap + 2, heap * 2
@lru_cache(None)
def game(heap):
    if heap >= 38:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’
for s in range(1, 38):
    print(s, game(s))

Ответ: 15

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

Задача 46#23707Максимум баллов за задание: 1

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 77:  # Если камней в куче стало больше 76
        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,70):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(7,i) == -2:
        print(i)
        break

Решение АР

from functools import lru_cache

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

@lru_cache(None)
def game(heap):
    if sum(heap) >= 77:
        return "END"
    elif any(game(x) == "END" for x in moves(heap)):
        return "WIN1"
    elif all(game(x) == "WIN1" for x in moves(heap)):
        return "LOSE1"
    elif any(game(x) == "LOSE1" for x in moves(heap)):
        return "WIN2"
    elif all(game(x) == "WIN1" or game(x) == "WIN2" for x in moves(heap)):
        return "LOSE2"

for s in range(1, 70):
    print(s, game((7, s)))

Ответ: 30

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

Задача 47#23710Максимум баллов за задание: 1

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 82:  # Если камней в куче стало больше 81
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 4, second_heap),
             game(first_heap, second_heap * 4)]  # Генерация всех возможных ходов
    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,78):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(4,i) == -2:
        print(i)

Решение АР

from functools import lru_cache

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

@lru_cache(None)
def game(heap):
    if sum(heap) >= 82:
        return "END"
    elif any(game(x) == "END" for x in moves(heap)):
        return "WIN1"
    elif all(game(x) == "WIN1" for x in moves(heap)):
        return "LOSE1"
    elif any(game(x) == "LOSE1" for x in moves(heap)):
        return "WIN2"
    elif all(game(x) == "WIN1" or game(x) == "WIN2" for x in moves(heap)):
        return "LOSE2"

for s in range(1, 77):
    h = 4, s
    print(s, game(h))

Ответ: 18

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

Задача 48#23713Максимум баллов за задание: 1

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

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

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

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

Показать ответ и решение
from functools import lru_cache


@lru_cache(None)
def f(a):
    if a <= 11:
        return 0
    moves = []
    if a > 0:
        moves.append(f(a - 1))
    if a > 2:
        moves.append(f(a - 3))
    pupsen_win = [i for i in moves if i <= 0]
    if pupsen_win:
        return -max(pupsen_win) + 1
    return -max(moves)


for i in range(12, 50):
    if f(i) == -2:
        print(i)

Ответ: 19

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

Задача 49#23716Максимум баллов за задание: 1

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

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 66:  # Если камней в куче стало больше 65
        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,55):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(11,i) == -2:
        print(i)

# Таких значений нет - записываем в ответ 0

Решение АР

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) >= 66:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’
for s in range(1, 55):
    print(s, game((11, s)))

Ответ: 0

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

Задача 50#23719Максимум баллов за задание: 1

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 88:  # Если камней в куче стало больше 87
        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(9,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) >= 88:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’
for s in range(1, 79):
    print(s, game((9, s)))

Ответ: 23

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

Задача 51#23722Максимум баллов за задание: 1

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

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

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

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

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 83:  # Если камней в куче стало больше 82
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap * 4, second_heap),
             game(first_heap, second_heap * 4)]  # Генерация всех возможных ходов
    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,78):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(5,i) == -2:
        print(i)

Решение АР

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

Ответ: 18

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

Задача 52#23725Максимум баллов за задание: 1

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

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

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

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

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

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

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 55:  # Если камней в куче стало больше 54
        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,45):
    # если в данной позиции возможен выигрыш Вани вторым ходом
    if game(10,i) == -2:
        print(i)
# Таких значений нет - в ответ записываем 0

Альтернативное решение программой

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) >= 55:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’
for s in range(1, 45):
    print(s, game((10, s)))

Ответ: 0

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

Задача 53#23804Максимум баллов за задание: 1

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

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

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

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

Показать ответ и решение
from functools import lru_cache


@lru_cache(None)
def f(first_heap, second_heap, third_heap, c=0):
    if first_heap + second_heap + third_heap <= 32:
        return 0
    if c > 4:
        return 123123
    moves = []
    if first_heap > 1:
        moves.append(f(first_heap - 1, second_heap, third_heap, c + 1))
        moves.append(f((first_heap + 1) // 2, second_heap, third_heap, c + 1))
    if second_heap > 1:
        moves.append(f(first_heap, second_heap - 1, third_heap, c + 1))
        moves.append(f(first_heap, (second_heap + 1) // 2, third_heap, c + 1))
    if third_heap > 1:
        moves.append(f(first_heap, second_heap, third_heap - 1, c + 1))
        moves.append(f(first_heap, second_heap, (third_heap + 1) // 2, c + 1))

    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(11, 100):
    if f(11, 11, i) == -2:
        print(i)

Ответ: 24

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

Задача 54#23807Максимум баллов за задание: 1

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

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

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

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

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

Из предыдущих заданий мы знаем, что Петя побеждает своим первым ходом при нечётных значениях в отрезке [17;49] и значениях 48,50, а также, что Петя побеждает своим вторым ходом в значениях: (3, 4, 5, 6, 8, 10, 12, 14). Значение, из которого ВСЕ первые ходы ведут в вышеописанные значения – это значение, в котором Ваня гарантированно побеждает вторым ходом или первым при неудачной игре Пети. Распишем значение и стратегии, при которых Ваня побеждает вторым или первым ходом:

S = 1  . Петя может увеличить количество камней только до 3  ходом ∗3  .

S = 2  . Петя может увеличить количество камней до 3  ходом + 1  или до 5  ходом + 3  .

В ответ нужно указать количество значений S. Ответ: 2

Решение БУ

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

Решение АР

from functools import lru_cache

def moves(heap):
    m = []
    if (heap * 3) % 2 != 0:
        m += [heap * 3]
    if (heap + 1) % 2 != 0:
        m += [heap + 1]
    if (heap + 3) % 2 != 0:
        m += [heap + 3]
    return m

@lru_cache(None)
def game(heap):
    if heap >= 51:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’

count = 0
for s in range(1, 51):
    count += (game(s) == ’LOSE2’)
print(count)

Ответ: 2

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

Задача 55#23810Максимум баллов за задание: 1

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

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

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

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

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

Решение БУ

from functools import lru_cache


@lru_cache(None)
def game(heap):  # Функция игры

    # Если кол-во таблеток в куче стало более 112
    if heap > 112:
        # Возвращаем 1,
        # которая преобразуется в победу Тринити первым ходом из-за "плохого" хода Нео
        return 1

    # Если кол-во таблеток в куче стало не менее 45
    if heap >= 45:
        return 0  # Прекращаем игру

    # Прописываем возможные ходы в партии
    moves = [game(heap + 2), game(heap * 3)]

    # Находим значения, через которые может победить Нео
    neo_win = [i for i in moves if i <= 0]

    if neo_win:  # Если такие значения нашлись и список не пуст
        return -max(neo_win) + 1
    else:  # Иначе побеждает Тринити максимальным ходом
        return -max(moves)


# Нео - первый игрок
# Тринити - второй игрок
for S in range(1, 44 + 1):
    # Если в данной позиции Тринити гарантированно выигрывает своим вторым ходом
    if game(S) == -2:
        print(S)  # В ответ берём последнее выведенное значение

Решение АР

from functools import lru_cache

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

@lru_cache(None)
def game(heap):
    if 45 <= heap <= 112:
        return ’END’
    elif heap > 112:
        return ’WIN1’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’

for s in range(44, 0, -1):
    if game(s) == ’LOSE2’:
        print(s)
        break

Ответ: 38

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

Задача 56#23813Максимум баллов за задание: 1

Для игры, описанной в задании #23811, узнайте, у кого из игроков есть выигрышная стратегия при S = 12  ? В ответ укажите первую русскую букву имени игрока в нижем регистре.

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

Решение БУ

from functools import lru_cache


@lru_cache(None)
def game(heap):  # Функция игры

    # Если кол-во морковок в куче стало более 100
    if heap > 100:
        # Возвращаем 1,
        # которая преобразуется в победу Свена первым ходом из-за "плохого" хода Олафа
        return 1

    # Если кол-во морковок в куче стало не менее 50
    if heap >= 50:
        return 0  # Прекращаем игру

    # Прописываем возможные ходы в партии
    moves = [game(heap + 1), game(heap + 2), game(heap + 3), game(heap * 3)]

    # Находим значения, через которые может победить Олаф
    olaf_win = [i for i in moves if i <= 0]

    if olaf_win:  # Если такие значения нашлись и список не пуст
        return -max(olaf_win) + 1
    else:  # Иначе побеждает Свен максимальным ходом
        return -max(moves)


# Олаф - первый игрок
# Свен - второй игрок
if game(12) > 0:  # Если значение положительное - побеждает Олаф
    print("о")
elif game(12) < 0:  # Если отрицательное - Свен
    print("с")

Решение АР

from functools import lru_cache

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

@lru_cache(None)
def game(heap):
    if 50 <= heap <= 100:
        return ’END’
    elif heap > 100:
        return ’WIN1’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’
    elif any(game(x) == ’LOSE2’ for x in moves(heap)):
        return ’WIN3’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ or game(x) == ’WIN3’ for x in moves(heap)):
        return ’LOSE3’
    elif any(game(x) == ’LOSE3’ for x in moves(heap)):
        return ’WIN4’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ or game(x) == ’WIN3’ or game(x) == ’WIN4’ for x in moves(heap)):
        return ’LOSE4’

print(game(12))

Ответ: с

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

Задача 57#23816Максимум баллов за задание: 1

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

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

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

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

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

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

В данной задаче требуется найти максимальную позиции типа LOSE2  . Таких позиций две. Это позиции S = 8  и S = 9.  Максимальная из них это S = 9.

 

Программное решение:

from functools import lru_cache


@lru_cache(None)
def f(a):
    if a >= 42:
        return 0
    moves = [f(a + 2), f(a * 3)]
    rick_win = [i for i in moves if i <= 0]
    if rick_win:
        return -max(rick_win) + 1
    return -max(moves)


for i in range(1, 42):
    if f(i) == -2:
        print(i)

Ответ: 9

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

Задача 58#24005Максимум баллов за задание: 1

Укажите два таких значения S  , при которых у Амины есть выигрышная стратегия, позволяющая ей выиграть первым или вторым ходом при любой игре Ани, и при этом у Амины нет стратегии, которая позволит ей гарантированно выиграть первым ходом.

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

Показать ответ и решение
from functools import lru_cache


@lru_cache(None)
def f(a, b):
    if a + b >= 100:
        return 0
    moves = [f(a + 1, b), f(a * 3, b), f(a, b + 1), f(a, b * 3)]
    anya_win = [i for i in moves if i <= 0]
    if anya_win:
        return -max(anya_win) + 1
    return -max(moves)


for i in range(1, 93):
    if f(7, i) == -2:
        print(i)

Ответ: 2530

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

Задача 59#24422Максимум баллов за задание: 1

Проанализируйте игру при S = 13  . У кого из кураторов в этом случае есть выигрышная стратегия? Напишите имя куратора большими буквами.

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

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры
    if first_heap + second_heap >= 47:  # Если камней в куче стало больше 46
        return 0  # Прекращаем игру
    moves = [game(first_heap + 1, second_heap+2), game(first_heap+2, 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)

print(game(10,13)) # -2, значит, имя победителя - ВАНЯ

Решение АР

from functools import lru_cache
def moves(h):
    a, b = h
    return (a + 1, b + 2), (a + 2, b + 1), (a * 2, b), (a, b * 2)
@lru_cache(None)
def f(h):
    if sum(h) >= 47:
        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’
h = 10, 13
print(f(h))

Ответ: ВАНЯ

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

Задача 60#25106Максимум баллов за задание: 1

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

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

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

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

Показать ответ и решение
from functools import lru_cache


@lru_cache(None)
def f(a, b, c=0):
    if a * b >= 1056:
        return 0
    if c > 4:
        return -10 ** 10
    moves = [f(a + 1, b, c + 1), f(a * 4, b, c + 1), f(a, b + 1, c + 1), f(a, b * 4, c + 1)]
    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, 132):
    if f(8, i) == -2:
        print(i)

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