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

20. Теория игр

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

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

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

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

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

Решение БУ

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)
        break

Ответ: 3

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

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

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

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

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

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

Скопируем область A2 : I5  и вставим ее в O2 : W 5  , O7 : W 10  , O12 : W 15  , O17 : W 20  . Это будут все возможные ситуации при разных первых ходах Пинки. Подпишем стобец O  как P 1  , S  как V1  , W  как P 2  .

Теперь надо написать старт, из которого начинается игра, и прописать формулы, по которым ходит Пинки. Пишем в K1  Start  , в K2  22  , а L2  любое значение S  . В M 2  запишем сумму K2  и L2  . В ячейках столбцов O  и P  пропишем формулы ходов Пинки (аналогично заполнению ячеек E2 : F 5  в 19 задаче). Осталось применить условное форматирование на ходы (ячейки, в которых суммы куч) Пинки зеленым, а на ходы Вжика красным.

Осталось только перебрать значения в L2  . При S > 53  видим, что Пинки не может выиграть. При S = 53,52  Пинки выигрывает вторым ходом, если первым делит вторую кучу на 2. Ответ 5253  .

 

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

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)

Ответ: 5253

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

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

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

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

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

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

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

S = 16  . Петя может увеличить количество камней до 17  , 19  или 32  камней. Во всех этих случаях Ване не составит труда следующим ходом завершить партию.

После того как мы определили значение, в котором Ваня побеждает своим первым ходом мы можем определить значение, в котором Петя побеждает своим вторым ходом. Значение, из которого ХОТЯ БЫ ОДИН ход ведет в 16  – это значение, в котором Петя побеждает своим вторым ходом. Распишем значения и стратегии, при которых Петя победит своим вторым ходом:

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

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

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

Ответ: 81315

Решение БУ

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) == "WIN2":
        print(s)

Ответ: 81315

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

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

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

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

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

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

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

S = 22  . Петя может увеличить количество камней до 23  или 44  камней. Ване не составит труда завершить партию следующим ходом.

После того как мы определили значение, при котором Ваня выигрывает своим первым ходом мы можем определить значения, при которых Петя побеждает своим вторым ходом. Значение, из которого ХОТЯ БЫ ОДИН ход ведет в   22  – это значение, в котором Петя выигрывает вторым ходом. Распишем значение и стратегии, при которых Петя побеждает своим вторым ходом:

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

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

Ответ: 1121

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

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,46):
    if game(i) == 2: # если в данной позиции возможен выигрыш Пети вторым ходом
        print(i)

Ответ: 1121

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

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

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

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

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

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

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

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

После того как мы определили значение, при котором Ваня выигрывает своим первым ходом мы можем определить значения, при которых Петя побеждает своим вторым ходом. Значение, из которого ХОТЯ БЫ ОДИН ход ведет в   18  – это значение, в котором Петя выигрывает вторым ходом. Распишем значение и стратегии, при которых Петя побеждает своим вторым ходом:

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

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

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

Ответ: 91617

Решение БУ

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))

Ответ: 91617

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

Задача 46#23706Максимум баллов за задание: 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)

Решение АР

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)))

Ответ: 3134

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

Задача 47#23709Максимум баллов за задание: 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):
    print(s, game((4, s)))

Ответ: 1619

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

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

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

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

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

Ответ: 1618

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

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

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

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

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

Решение БУ

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)

Решение АР

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)))

Ответ: 2126

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

Задача 50#23718Максимум баллов за задание: 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)))

Ответ: 56

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

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

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

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

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

Решение БУ

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)))

Ответ: 219

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

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

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

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

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

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

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)

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

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)))

Ответ: 111421

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

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

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

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


count = 0
for i in range(11, 100):
    if f(11, 11, i) == 2:
        count += 1
print(count)


Ответ: 5

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

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

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

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

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

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

Из предыдущего задания мы знаем, что Ваня побеждает своим первым ходом при следующих значениях: (7,9,11,13,15,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46)  . Все чётные значения из этого списка мы можем игнорировать, поскольку, по условию нам известно, что после каждого хода должно получаться нечётное значение. Чётным значением может быть только изначальное значение S до совершения первого хода. Значение, из которого ХОТЯ БЫ ОДИН ход ведет в вышеописанное множество значений – это значение, в котором Петя выигрывает вторым ходом. Распишем два максимальных значения S и стратегии, при которых Петя побеждает своим вторым ходом:

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

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

Ответ: 1214

Решение БУ

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)

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

Решение АР

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’

for s in range(1, 51):
    if game(s) == ’WIN2’:
        print(s)

Ответ: 1214

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

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

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

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

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

Решение БУ

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, end=’’)  # Делаем вывод для получения готового ответа

Решение АР

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(1, 45):
    if game(s) == ’WIN2’:
        print(s)

Ответ: 143940

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

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

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

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

Решение БУ

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(13) > 0:  # Если значение положительное - побеждает Олаф
    print("о")
elif game(13) < 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’

print(game(13))

Ответ: о

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

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

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

– Рик не может выиграть за один ход;

– Рик может выиграть своим вторым ходом независимо от того, как будет ходить Морти.

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

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

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

Для начала найдём все позиции типа WIN1  . Это все позиции S ≥ 14.  Значит позиции S = 13  и S = 12  это позиции LOSE1 . В них можно прийти из позиций S = 4,10,11.

 

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

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)

Ответ: 411

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

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

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

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

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

Ответ: 26

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

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

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

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

Решение БУ

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)

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

Решение АР

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’
for i in range(1, 50):
    h = 10, i
    if f(h) == ’P2’:
        print(i)

Ответ: 16

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

Задача 60#25105Максимум баллов за задание: 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)

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