1902.py

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может: убрать из кучи 3 камня убрать из кучи 8 камней уменьшить количество камней в куче в 3 раза (количество камней, полученное при делении, округляется до меньшего) Например, из кучи в 20 камней за один ход можно получить кучу из 17, 12 или 6 камней. Игра завершается, когда количество камней в куче становится не более 16. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу из 16 или менее камней. В начальный момент в куче было S камней, S≥17. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Задание 19: Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом. Задание 20: Найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия: - Петя не может выиграть за один ход - Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня Найденные значения запишите в ответе в порядке возрастания. Задание 21: Найдите минимальное значение S, при котором одновременно выполняются два условия: - у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети - у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом
def g (s, hod, end):
    if s <= 16:
        return hod in end
    if hod >= max(end):
        return False
    moves = [
        g(s - 3, hod + 1, end), 
        g(s - 8, hod + 1, end), 
        g(s // 3, hod + 1, end)
        ]
    return any(moves) if ((hod + 1) % 2) == (end[0] % 2) else all(moves)

print([
    s for s in range(17, 400)
#    if g(s, 0, end=[2])
#    if g(s, 0, end=[3]) 
#    if g(s, 0, end=[2, 4]) and not g(s, 0, end=[2])
    ])
    

"""
Два игрока, Петя и Ваня, играют в следующую игру. 
Перед игроками лежит куча камней. 
Игроки ходят по очереди, первый ход делает Петя. 
За один ход игрок может:

    убрать из кучи 3 камня
    убрать из кучи 8 камней
    уменьшить количество камней в куче в 3 раза 
    (количество камней, полученное при делении, 
    округляется до меньшего)

Например, из кучи в 20 камней 
за один ход можно получить кучу 
из 17, 12 или 6 камней.

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

Будем говорить, что игрок имеет выигрышную стратегию, 
если он может выиграть при любых ходах противника.

Задание 19:
    Укажите минимальное значение S, при котором Петя 
    не может выиграть за один ход, 
    но при любом ходе Пети 
    Ваня может выиграть своим первым ходом.

Задание 20:
    Найдите два наименьших значения S, 
    при которых у Пети есть выигрышная стратегия, 
    причём одновременно выполняются два условия:
    - Петя не может выиграть за один ход
    - Петя может выиграть своим вторым ходом 
    независимо от того, как будет ходить Ваня
Найденные значения запишите в ответе в порядке возрастания.

Задание 21:
    Найдите минимальное значение S, 
    при котором одновременно выполняются два условия:
    - у Вани есть выигрышная стратегия, позволяющая ему 
    выиграть первым или вторым ходом при любой игре Пети
    - у Вани нет стратегии, которая позволит ему 
    гарантированно выиграть первым ходом

"""
def g (s, hod, end):
    if s <= 16:
        return hod in end
    if hod >= max(end):
        return False
    moves = [
        g(s - 3, hod + 1, end), 
        g(s - 8, hod + 1, end), 
        g(s // 3, hod + 1, end)
        ]
    return any(moves) if ((hod + 1) % 2) == (end[0] % 2) else all(moves)

print([
    s for s in range(17, 400)
#    if g(s, 0, end=[2])
#    if g(s, 0, end=[3]) 
#    if g(s, 0, end=[2, 4]) and not g(s, 0, end=[2])
    ])
    

"""
Два игрока, Петя и Ваня, играют в следующую игру. 
Перед игроками лежит куча камней. 
Игроки ходят по очереди, первый ход делает Петя. 
За один ход игрок может:

    убрать из кучи 3 камня
    убрать из кучи 8 камней
    уменьшить количество камней в куче в 3 раза 
    (количество камней, полученное при делении, 
    округляется до меньшего)

Например, из кучи в 20 камней 
за один ход можно получить кучу 
из 17, 12 или 6 камней.

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

Будем говорить, что игрок имеет выигрышную стратегию, 
если он может выиграть при любых ходах противника.

Задание 19:
    Укажите минимальное значение S, при котором Петя 
    не может выиграть за один ход, 
    но при любом ходе Пети 
    Ваня может выиграть своим первым ходом.

Задание 20:
    Найдите два наименьших значения S, 
    при которых у Пети есть выигрышная стратегия, 
    причём одновременно выполняются два условия:
    - Петя не может выиграть за один ход
    - Петя может выиграть своим вторым ходом 
    независимо от того, как будет ходить Ваня
Найденные значения запишите в ответе в порядке возрастания.

Задание 21:
    Найдите минимальное значение S, 
    при котором одновременно выполняются два условия:
    - у Вани есть выигрышная стратегия, позволяющая ему 
    выиграть первым или вторым ходом при любой игре Пети
    - у Вани нет стратегии, которая позволит ему 
    гарантированно выиграть первым ходом

"""

Репозиторий на GitHub