1906.py

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


print([
    s for s in range(1, 59)
    if any(
        a1 + b1 < 65 and g(a1, b1, 1, end=[2])
        for a1, b1 in ((7, s), (6, s + 1), (18, s), (6, 3 * s))
    ) and any(
        a1 + b1 < 65 and not g(a1, b1, 1, end=[2])
        for a1, b1 in ((7, s), (6, s + 1), (18, s), (6, 3 * s))
    )
#    if g(6, s, 0, end=[3]) and not g(6, s, 0, end=[1])
#    if g(6, s, 0, end=[2, 4]) and not g(6, s, 0, end=[2])
])


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

Игра завершается в тот момент, когда суммарное количество камней в кучах становится
не менее 65. Победителем считается игрок, сделавший последний ход.

В начальный момент в первой куче 6 камней, во второй - S камней, 1 <= S <= 58.

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

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

21. Найдите минимальное значение S, при котором одновременно:
    - у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом
      при любой игре Пети;
    - у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
"""
def g(a, b, hod, end):
    if a + b >= 65:
        return hod in end
    if hod >= max(end):
        return False
    moves = [
        g(a + 1, b, hod + 1, end),
        g(a, b + 1, hod + 1, end),
        g(a * 3, b, hod + 1, end),
        g(a, b * 3, hod + 1, end)
    ]
    return any(moves) if ((hod + 1) % 2) == (end[0] % 2) else all(moves)


print([
    s for s in range(1, 59)
    if any(
        a1 + b1 < 65 and g(a1, b1, 1, end=[2])
        for a1, b1 in ((7, s), (6, s + 1), (18, s), (6, 3 * s))
    ) and any(
        a1 + b1 < 65 and not g(a1, b1, 1, end=[2])
        for a1, b1 in ((7, s), (6, s + 1), (18, s), (6, 3 * s))
    )
#    if g(6, s, 0, end=[3]) and not g(6, s, 0, end=[1])
#    if g(6, s, 0, end=[2, 4]) and not g(6, s, 0, end=[2])
])


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

Игра завершается в тот момент, когда суммарное количество камней в кучах становится
не менее 65. Победителем считается игрок, сделавший последний ход.

В начальный момент в первой куче 6 камней, во второй - S камней, 1 <= S <= 58.

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

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

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

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