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

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

Задача 1#38807

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

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

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

Показать ответ и решение
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#38806

Для игры, описанной в предыдущем задании, найдите два таких значения S  , при которых у ДЮ есть выигрышная стратегия, причём ДЮ не может выиграть за один ход и ДЮ может выиграть своим вторым ходом независимо от того, как будет ходить ТС.

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

Показать ответ и решение
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’

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

Ответ: 1415

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

Задача 3#38805

Два игрока, ДЮ и ТС, играют в следующую игру. Перед игроками лежит куча крабов. Игроки ходят по очереди, первый ход делает ДЮ. За один ход игрок может добавить в кучу одного краба или добавить в кучу два краба или увеличить количество крабов в куче в 3  раза. Например, имея кучу из 10  крабов, за один ход можно получить кучу из 11  или 12  или 30  крабов. Чтобы делать ходы, у каждого игрока есть неограниченное количество крабов. Игра завершается в тот момент, когда количество крабов в куче становится не менее 50  .

Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в куче будет 50  или более крабов. В начальный момент в куче было S  крабов, 1 ≤ S ≤ 49  .

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.

Найдите минимальное значение S  , при котором ТС выигрывает своим первым ходом при любой игре ДЮ.

Показать ответ и решение
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’

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

Ответ: 16

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

Задача 4#42990

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

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

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

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

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

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

@lru_cache(None)
def game(h):
    if sum(h) >= 287:
        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) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’

for i in range(1, 264):
    if game((23, i)) == ’LOSE2’:
        print(i)

Ответ: 51

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

Задача 5#42989

Для игры, описанной в предыдущем задании, найдите такое значение S  , при котором у Питера Паркера есть выигрышная стратегия, причём Питер Паркер не может выиграть за один ход и Питер Паркер может выиграть своим вторым ходом независимо от того, как будет ходить Тони Старк.

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

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

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

@lru_cache(None)
def game(h):
    if sum(h) >= 287:
        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’

for i in range(1, 264):
    if game((23, i)) == ’WIN2’:
        print(i)

Ответ: 48

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

Задача 6#42987

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

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

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

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

Показать ответ и решение
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 game(h):
    if sum(h) >= 37:
        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) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’

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

Ответ: 13

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

Задача 7#42986

Для игры, описанной в предыдущем задании, найдите такие значения S  , при которых у Наташи Романофф есть выигрышная стратегия, причём Наташа Романофф не может выиграть за один ход и Наташа Романофф может выиграть своим вторым ходом независимо от того, как будет ходить Елена Белова.

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

Показать ответ и решение
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 game(h):
    if sum(h) >= 37:
        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’

for i in range(1, 33):
    if game((3, i)) == ’WIN2’:
        print(i)

Ответ: 815

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

Задача 8#42985

Два игрока, Наташа Романофф и Елена Белова, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Наташа Романофф. За один ход игрок может добавить в одну из куч два камня или увеличить количество камней в куче в два раза. Например, пусть в одной куче 6  камней, а в другой 9  камней; такую позицию мы будем обозначать (6,9)  . За один ход из позиции (6,9)  можно получить любую из четырёх позиций: (8,9),(12,9),(6,11),(6,18)  . Чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

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

В начальный момент в первой куче было 3  камня, во второй 1 ≤ S ≤ 33  камня. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.

Известно, что Елена Белова выигрывает своим первым ходом при любой игре Наташи Романофф. Укажите такое значение S  , когда такая ситуация возможна.

Показать ответ и решение
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 game(h):
    if sum(h) >= 37:
        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’

for i in range(1, 34):
    if game((3, i)) == ’LOSE1’:
        print(i)

Ответ: 16

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

Задача 9#42984

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

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

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

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

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

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

@lru_cache(None)
def game(h):
    if h >= 81:
        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) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’

for i in range(1, 81):
    if game(i) == ’LOSE2’:
        print(i)
        break

Ответ: 18

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

Задача 10#42983

Для игры, описанной в предыдущем задании, найдите такие значения S  , при которых у Тора есть выигрышная стратегия, причём Тор не может выиграть за один ход и Тор может выиграть своим вторым ходом независимо от того, как будет ходить Локи.

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

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

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

@lru_cache(None)
def game(h):
    if h >= 81:
        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’

for i in range(1, 81):
    if game(i) == ’WIN2’:
        print(i)

Ответ: 823

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

Задача 11#42982

Два игрока, Тор и Локи, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Тор. За один ход игрок может добавить в кучу три камня или увеличить количество камней в куче в три раза. Например, имея кучу из 15  камней, за один ход можно получить кучу из 18  или 45  камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.

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

В начальный момент в куче было 1 ≤ S ≤ 80  . Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.

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

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

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

@lru_cache(None)
def game(h):
    if h >= 81:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    elif any(game(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’

for i in range(1, 81):
    if game(i) == ’LOSE1’:
        print(i)
        break

Ответ: 9

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

Задача 12#42981

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

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

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

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

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

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

@lru_cache(None)
def game(h):
    if h >= 25:
        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) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(h)):
        return ’LOSE2’

for i in range(1, 25):
    if game(i) == ’LOSE2’:
        print(i)

Ответ: 10

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

Задача 13#42980

Для игры, описанной в предыдущем задании, найдите два таких значения S  , при которых у Ванды есть выигрышная стратегия, причём Ванда не может выиграть за один ход и Ванда может выиграть своим вторым ходом независимо от того, как будет ходить Доктор Стрендж.

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

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

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

@lru_cache(None)
def game(h):
    if h >= 25:
        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’

for i in range(1, 25):
    if game(i) == ’WIN2’:
        print(i)

Ответ: 611

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

Задача 14#42979

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

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

В начальный момент в куче было 1 ≤ S ≤ 24  . Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.

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

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

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

@lru_cache(None)
def game(h):
    if h >= 25:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(h)):
        return ’WIN1’

for i in range(1, 25):
    if game(i) == ’WIN1’:
        print(i)
        break

Ответ: 13

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

Задача 15#38804

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

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

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

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

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

@lru_cache(None)
def f(h):
    if (h >= 42):
        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 reversed(range(1, 42)):
    if f(s) == ’V2’:
        print(s)

Ответ: 18

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

Задача 16#38803

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

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

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

@lru_cache(None)
def f(h):
    if (h >= 42):
        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’

for s in reversed(range(1, 42)):
    if f(s) == ’P2’:
        print(s)
        break

Ответ: 19

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

Задача 17#38802

Два игрока, АР и АВ, играют в следующую игру. Перед игроками лежит куча маркеров. Игроки ходят по очереди, первый ход делает АР. За один ход игрок может добавить в кучу один маркер или увеличить количество маркеров в куче в    2  раза. Например, имея кучу из 17  маркеров, за один ход можно получить кучу из 18  или 34  маркеров. Чтобы делать ходы, у каждого игрока есть неограниченное количество маркеров. Игра завершается в тот момент, когда количество маркеров в куче становится не менее 42  .

Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в куче будет 42  или более маркеров. В начальный момент в куче было S  маркеров, 1 ≤ S ≤ 41  .

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.

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

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

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

@lru_cache(None)
def f(h):
    if (h >= 42):
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’P1’

for s in range(1, 42):
    if f(s) == ’P1’:
        print(s)
        break

Ответ: 21

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

Задача 18#33612

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

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

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

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

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

@lru_cache(None)
def f(h):
    if h >= 185:
        return "END"
    if any(f(x) == "END" for x in m(h)):
        return "P1"
    if all(f(x) == "P1" for x in m(h)):
        return "V1"
    if any(f(x) == "V1" for x in m(h)):
        return "P2"
    if all(f(x) == "P1" or f(x) == "P2" for x in m(h)):
        return "V2"
for i in range(1, 185):
    if f(i) == "V2":
        print(i)

Ответ: 90

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

Задача 19#33611

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

— Петя не может выиграть за один ход;

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

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

Показать ответ и решение
def f(h):
    if h >= 185:
        return "END"
    if any(f(x) == "END" for x in m(h)):
        return "P1"
    if all(f(x) == "P1" for x in m(h)):
        return "V1"
    if any(f(x) == "V1" for x in m(h)):
        return "P2"
for i in range(1, 185):
    if f(i) == "P2":
        print(i)

Ответ: 4691

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

Задача 20#33610

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

Игра завершается в тот момент, когда количество камней в куче становится не менее 185  . Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в куче будет 185  или больше камней. В начальный момент в куче было S  камней; 1 ≤ S ≤ 184  .

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

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

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

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

@lru_cache(None)
def f(h):
    if h >= 185:
        return "END"
    if any(f(x) == "END" for x in m(h)):
        return "P1"
    if all(f(x) == "P1" for x in m(h)):
        return "V1"
for i in range(1, 185):
    if f(i) == "V1":
        print(i)

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