19.02 Перекладывание камней две кучи
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче будет 6 камней, а в другой 7 камней; такую позицию мы будем обозначать (6, 7). За один ход из позиции (6, 7) можно получить любую из четырёх позиций: (7, 7), (6, 8), (12, 7), (6, 14). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 66.
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет 66 или более камней. В начальный момент в первой куче было 11 камней, во второй куче S камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение 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+1,i) == 1 or game(11*2,i) == 1 or game(11,i+1) == 1 or game(11,i*2) == 1: print(i) break
Решение АР
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 any(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)))
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или увеличить количество камней в куче в три раза. Например, пусть в одной куче будет 10 камней, а в другой 8 камней; такую позицию мы будем обозначать (10, 8). За один ход из позиции (10, 8) можно получить любую из четырёх позиций: (12, 8), (10, 10), (30, 8), (10, 24). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 88.
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет 88 или более камней. В начальный момент в первой куче было 9 камней, во второй куче S камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Если такого значения нет, в ответ запишите 0.
Решение БУ
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+2,i) == 1 or game(9*3,i) == 1 or game(9,i+2) == 1 or game(9,i*3) == 1: print(i) break
Решение АР
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 any(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)))
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в четыре раза. Например, пусть в одной куче будет 11 камней, а в другой 9 камней; такую позицию мы будем обозначать (11, 9). За один ход из позиции (11, 9) можно получить любую из четырёх позиций: (12, 9), (11, 10), (44, 9), (11, 36). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 83.
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет 83 или более камней. В начальный момент в первой куче было 5 камней, во второй куче S камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение 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+1,i) == 1 or game(5*4,i) == 1 or game(5,i+1) == 1 or game(5,i*4) == 1 : print(i) break
Решение АР
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 any(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)))
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче будет 14 камней, а в другой 5 камней; такую позицию мы будем обозначать (14, 5). За один ход из позиции (14, 5) можно получить любую из четырёх позиций: (15, 5), (14, 6), (28, 5), (14, 10). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 55.
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет 55 или более камней. В начальный момент в первой куче было 10 камней, во второй куче 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) == 1: print(i) break
Альтернативное решение программой
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)))
Ошибка.
Попробуйте повторить позже
Два куратора, Петя и Ваня, играют в следующую игру. Перед кураторами открыта беседа отслушек, в которой есть два
типа стикеров: Бу! и Кыш-кыш-кыш. Кураторы ходят по очереди, первый ход делает Петя. За один ход куратор может
отправить один стикер одного типа и два стикера другого типа, или же увеличить количество стикеров любого типа в два
раза. Например, пусть в беседе было стикеров Бу! и
стикеров Кыш-кыш-кыш; такую позицию мы будем обозначать
. За один ход из позиции
можно получить любую из четырёх позиций:
.
Чтобы делать ходы, у каждого куратора есть неограниченное количество стикеров. Игра завершается в тот
момент, когда суммарное количество стикеров в беседе становится не менее
. Победителем считается
куратор, сделавший последний ход, то есть первым получивший позицию, в которой в беседе будет
или больше стикеров. В начальный момент в беседе было
стикеров Бу! и
стикеров Кыш-кыш-кыш,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Петя сделал неудачный первый ход, после которого Ваня выиграл своим первым ходом. Назовите минимальное
значение , при котором это возможно.
Решение БУ
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+1,i+2) == 1 or game(10+2,i+1) == 1 or game(10*2,i) == 1 or game(10,i*2) == 1: print(i) break
Решение АР
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(any(f(x) == ’P1’ for x in moves(h))): return ’V1’ for i in range(1, 50): h = 10, i if f(h) == ’V1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или добавить столько камней,
сколько их в данный момент в другой куче. Например, пусть в одной куче камней, а в другой 9 камней; такую позицию
мы будем обозначать
. За один ход из позиции
можно получить любую из четырёх позиций:
,
,
,
. Чтобы делать ходы, у каждого игрока есть неограниченное количество
камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее . Победителем
считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет
или больше
камней.
В начальный момент в первой куче было камней, во второй куче –
камней,
.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение
, при котором это возможно.
Решение руками
Ход, который прибавляет больше всего камней – это ход прибавления количества камней из другой кучи. Рассмотрим стратегию, при которой Ваня победит после неудачного хода Пети:
При Петя добавит в первую кучу
и получит
, а дальше Ваня добавит во вторую кучу
и
выиграет с
.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 75: # Если камней в куче стало больше 74 return 0 # Прекращаем игру moves = [game(first_heap + 1, second_heap), game(first_heap, second_heap + 1), game(first_heap + second_heap, second_heap),game(first_heap, second_heap + first_heap)] # Генерация всех возможных ходов 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,68): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(7+1,i) == 1 or game(7+i,i) == 1 or game(7,i+1) == 1 or game(7,i+7) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a, b+1), (a, b+a), (a+1, b), (a+b, b) @lru_cache(None) def game(h): if sum(h) >= 75: 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 s in range(1, 68): if game((7, s)) == ’LOSE1’: print(s)
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить один камень в одну из куч и два камня в другую или же
увеличить количество камней в любой куче в два раза. Например, пусть в одной куче 6 камней, а в другой 8 камней;
такую позицию мы будем обозначать (6, 8). За один ход из позиции (6, 8) можно получить любую из четырёх
позиций: (7, 10), (8, 9), (12, 8), (6, 16). Чтобы делать ходы, у каждого игрока есть неограниченное количество
камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 41.
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в
кучах будет 41 или больше камней. В начальный момент в первой куче было 8 камней, во второй куче –
Петя сделал неудачный первый ход, после которого Ваня выиграл своим первым ходом. Назовите минимальное
значение , при котором это возможно.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 41: # Если камней в куче стало больше 40 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,33): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(8+1,i+2) == 1 or game(8+2,i+1) == 1 or game(8*2,i) == 1 or game(8,i*2) == 1: print(i) break
Решение АР
from functools import lru_cache def m(n): a, b = n return (a+1, b+2), (a+2, b+1), (a*2, b), (a, b*2) @lru_cache(None) def f(n): if sum(n) >= 41: return ’end’ if any(f(x) == ’end’ for x in m(n)): return ’win 1’ if any(f(x) == ’win 1’ for x in m(n)): return ’lose 1’ for s in range(1, 50): n = 8, s if f(n) == ’lose 1’: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или увеличить количество камней в
куче в два раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в
тот момент, когда суммарное количество камней в кучах становится не менее . Победителем считается
игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет
или больше
камней.
В начальный момент в первой куче было камней, во второй куче —
камней,
. Будем говорить, что
игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение
, при котором это возможно.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 75: # Если камней в куче стало больше 74 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap), 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,66): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(9+2,i) == 1 or game(9*2,i) == 1 or game(9,i+2) == 1 or game(9,i*2) == 1: print(i) break
Решение АР
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 f(h): if sum(h) >= 75: return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’P1’ if any(f(x) == ’P1’ for x in moves(h)): return ’V1’ for i in range(1, 66): h = 9, i if f(h) == ’V1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или увеличить количество
камней в куче в три раза. Например, пусть в одной куче камня, а в другой
камней; такую позицию
мы будем обозначать
. За один ход из этой позиции можно получить любую из четырёх позиций:
. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество
камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее . Победителем
считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет
или больше
камней.
В начальный момент в первой куче было пять камней, во второй куче — камней;
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, то есть не гарантируют выигрыш независимо от игры противника.
Найдите минимальное значение , при котором Петя может выиграть первым ходом.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 59: # Если камней в куче стало больше 58 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap), 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,54): # если в данной позиции возможен выигрыш Пети первым ходом if game(5,i) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a + 2, b), (a, b + 2), (a * 3, b), (a, b * 3) @lru_cache(None) def f(h): if sum(h) >= 59: return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’WIN1’ for i in range(1, 54): h = 5, i if f(h) == ’WIN1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или увеличить количество камней в куче в два раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 74. Победителем считается игрок, сделавший последний ход, т.е. первым получивший позицию, в которой в кучах будет 74 или больше камней.
В начальный момент в первой куче было 7 камней, во второй куче – S камней,
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение
, при котором это возможно.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 74: # Если камней в куче стало больше 73 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap), 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,67): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(7+2,i) == 1 or game(7*2,i) == 1 or game(7,i+2) == 1 or game(7,i*2) == 1: print(i) break
Решение АР
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 f(h): if sum(h) >= 74: return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’P1’ if any(f(x) == ’P1’ for x in moves(h)): return ’V1’ for i in range(1, 66): h = 7, i if f(h) == ’V1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или добавить в одну из куч удвоенное число камней, лежащих в другой куче.
Например, пусть в одной куче 8 камней, а в другой 5 камней; такую позицию в игре будем обозначать (8,5). Тогда за один ход можно получить любую из четырёх позиций: (9,5), (18,5), (8, 6), (8,21). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 84. Победителем
считается игрок, сделавший последний ход, то есть первым получивший такую позицию, при которой в кучах будет 84
или больше камней. В начальный момент в первой куче было восемь камней, во второй куче — камней;
.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение
, когда такая ситуация возможна.
Ответ дайте в троичной системе счисления.
Решение БУ
from functools import lru_cache def cc3(n): # функция для перевода числа в троичную систему счисления s = ’’ while n > 0: s = str(n % 3) + s n //= 3 return s @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 84: # Если камней в кучах стало больше 83 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap), game(first_heap + second_heap * 2, second_heap),game(first_heap, second_heap + 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,76): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(8+1,i) == 1 or game(8+i*2,i) == 1 or game(8,i+1) == 1 or game(8,i+8*2) == 1 : print(cc3(i)) break
Решение АР
from functools import lru_cache def perevod(n, a): s = ’’ while n != 0: s = str(n % a) + s n //= a return s def moves(h): a, b = h return (a+1, b), (a, b+1), (a + b*2, b), (a, b + a * 2) @ lru_cache(None) def f(h): if sum(h) >= 84: return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’P1’ if any(f(x) == ’P1’ for x in moves(h)): return ’V1’ for i in range(1, 76): h = 8, i if f(h) == ’V1’: print(perevod(i, 3)) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в
куче в три раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в
тот момент, когда суммарное количество камней в кучах становится не менее . Победителем считается
игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет
или больше
камней.
В начальный момент в первой куче было камня, во второй куче —
камней,
. Будем говорить, что
игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение
, при котором это возможно.
Решение руками
Самый мощный ход в партии это . Петя совершит данный ход, чтобы "подарить"победу Ване. Рассмотрим значение
и стратегию, при которой Ваня побеждает после неудачного хода Пети:
При Петя может увеличить кол-во камней во второй куче в
раза и тогда станет
, после чего Ваня
увеличивает кол-во камней в куче в
раза и выигрывает с кучами
, где сумма
.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 45: # Если камней в куче стало больше 44 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap), 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,41): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(4+1,i) == 1 or game(4*3,i) == 1 or game(4,i+1) == 1 or game(4,i*3) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a, b+1), (a, b*3), (a+1, b), (a*3, b) @lru_cache(None) def game(h): if sum(h) >= 45: 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 s in range(1, 41): if game((4, s)) == ’LOSE1’: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в любую кучу один камень или увеличить количество камней в любой куче в четыре раза.
Игра завершается в тот момент, когда суммарное количество камней в двух кучах становится не менее . В
начальный момент в первой куче было
камней, а во второй —
камней,
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение
при котором это возможно.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 125: # Если камней в кучах стало больше 124 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap), 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,118): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(7+1,i) == 1 or game(7*4,i) == 1 or game(7,i+1) == 1 or game(7,i*4) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a,b = h return (a*4,b),(a,b*4),(a+1,b),(a,b+1) @lru_cache(None) def f(h): if sum(h)>=125: return ’END’ if any(f(x)==’END’ for x in moves(h)): return ’P1’ if any(f(x)==’P1’ for x in moves(h)): return ’V1’ for i in range(1,120): h = i,7 if f(h) == ’V1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в
куче в два раза. Например, пусть в одной куче будет камней, а в другой
камней; такую позицию мы
будем обозначать
. За один ход из позиции
можно получить любую из четырёх позиций:
. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не
менее
.
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет или более камней. В начальный момент в первой куче было
камней, во второй куче
камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение
, когда такая ситуация возможна.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 42: # Если камней в кучах стало больше 41 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap), 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,35): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(7+1,i) == 1 or game(7*2,i) == 1 or game(7,i+1) == 1 or game(7,i*2) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a + 1, b), (a, b + 1), (a * 2, b), (a, b * 2) @lru_cache(None) def f(h): if (sum(h) >= 42): return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’P1’ if any(f(x) == ’P1’ for x in moves(h)): return ’V1’ for s in range(1, 35): h = 7, s if f(h) == ’V1’: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или добавить в одну из куч три камня
или увеличить количество камней в куче в два раза. Игра завершается в тот момент, когда суммарное количество камней в
кучах становится не менее .
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет или более камней. В начальный момент в первой куче было
камней, во второй куче
камней,
.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение
, когда такая ситуация возможна.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 51: # Если камней в кучах стало больше 50 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap), 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,46): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if (game(5 + 2,i) == 1 or game(5+3,i) == 1 or game(5*2,i) == 1 or game(5,i + 2) == 1 or game(5,i+3) == 1 or game(5,i*2) == 1): print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a + 2, b), (a, b + 2), (a + 3, b), (a, b + 3), (a * 2, b), (a, b * 2) @lru_cache(None) def f(h): if sum(h) >= 51: return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’WIN1’ if any(f(x) == ’WIN1’ for x in moves(h)): return ’LOSE1’ for i in range(1, 46): h = i, 5 if f(h) == ’LOSE1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в любую кучу один камень или увеличить количество камней в
любой куче в четыре раза. Игра завершается в тот момент, когда общее количество камней в двух кучах
становится не менее . В начальный момент в первой куче было
камня, а во второй —
камней,
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение
, при котором это возможно.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 105: # Если камней в кучах стало больше 104 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap), 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,101): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(4+1,i) == 1 or game(4*4,i) == 1 or game(4,i+1) == 1 or game(4,i*4) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a+1, b), (a, b+1), (a*4, b), (a, b * 4) @lru_cache(None) def f(h): if sum(h) >= 105: return ’END’ if any(f(x) == ’END’ for x in moves(h)): return ’P1’ if any(f(x) == ’P1’ for x in moves(h)): return ’V1’ for i in range(1, 101): h = 4, i if f(h) == ’V1’: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит две кучи орехов. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч два ореха или увеличить количество орехов в куче в три раза. Например, имея кучу из 5 орехов, за один ход можно получить кучу из 7 или 15 орехов. У каждого игрока, чтобы делать ходы, есть неограниченное количество орехов. Игра завершается в тот момент, когда суммарное количество орехов в кучах становится не менее 52. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучи с суммой 52 или больше орехов.
В начальный момент в первой куче было 14 орехов, во второй куче — орехов,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение
, когда такая ситуация возможна.
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 52: # Если камней в кучах стало больше 51 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap), 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(2,37): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(14 + 2,i) == 1 or game(14*3,i) == 1 or game(14 ,i+ 2) == 1 or game(14,i*3) == 1: print(i) break
Решение АР
from functools import lru_cache def moves(h): a, b = h return (a*3, b), (a+2, b), (a, b*3), (a, b+2) @lru_cache(None) def game(h): if sum(h) >= 52: 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 s in range(2, 37): if game((14, s)) == ’LOSE1’: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в
куче в два раза. Например, пусть в одной куче будет камней, а в другой
камней; такую позицию мы
будем обозначать
За один ход из позиции
можно получить любую из четырёх позиций:
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не
менее
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет или более камней. В начальный момент в первой куче было
камня, во второй куче
камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Петя выигрывает в первый ход. Укажите минимальное значение когда такая ситуация
возможна.
Решение руками
В этой задаче требуется найти позицию где Петя побеждает первым ходом. Петя может выиграть первым ходом,
увеличив первую кучу или вторую кучу. Рассматривать ход для обеих куч не имеет смысла, так как
для завершения партии ходом
требуется изначальное большое значение S. Распишем получившиеся
ситуации:
В первом случае, минимальное S, при котором данное неравенство будет выполнено равняется . Во втором -
.
В ответ нужно указать минимальное значение 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, second_heap+1), game(first_heap+1, second_heap), 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,43): # если в данной позиции возможен выигрыш Пети первым ходом if game(4,i) == 1: print(i) break
Альтернативное решение программой
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) >= 47: return ’END’ elif any(game(x) == ’END’ for x in moves(heap)): return ’P1’ elif all(game(x) == ’P1’ for x in moves(heap)): return ’V1’ elif any(game(x) == ’V1’ for x in moves(heap)): return ’P2’ elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)): return ’V2’ for s in range(1, 43): if game((4, s)) == ’P1’: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или увеличить количество камней в
куче в три раза. Например, пусть в одной куче будет камней, а в другой
камней; такую позицию
мы будем обозначать
За один ход из позиции
можно получить любую из четырёх позиций:
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не
менее
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет или более камней. В начальный момент в первой куче было
камней, во второй куче
камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Найдите минимальное значение , при котором Ваня выигрывает своим первым ходом при любой игре
Пети.
Решение руками Определим при каком наименьшем значении S Петя побеждает первым ходом:
=
При Петя выигрывает своим первым ходом. Рассмотрим позицию
Ваня выиграл за
ход
Ваня выиграл за
ход
Ваня выиграл за
ход
Ваня выиграл за
ход
Значит это позиция выигрыша Вани первым ходом. Ответ .
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 63: # Если камней в кучах стало больше 62 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap), 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,56): # если в данной позиции возможен выигрыш Вани первым ходом if game(7,i) == -1: print(i) break
Решение АР
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) >= 63: return ’END’ elif any(game(x) == ’END’ for x in moves(heap)): return ’P1’ elif all(game(x) == ’P1’ for x in moves(heap)): return ’V1’ elif any(game(x) == ’V1’ for x in moves(heap)): return ’P2’ elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)): return ’V2’ for s in range(1, 56): if game((7, s)) == ’V1’: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в
куче в два раза. Например, пусть в одной куче будет камней, а в другой
камней; такую позицию
мы будем обозначать
За один ход из позиции
можно получить любую из четырёх позиций:
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не
менее
Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах
будет или более камней. В начальный момент в первой куче было
камня, во второй куче
камней,
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение
когда такая ситуация возможна.
Решение руками
Предположим, что Петя увеличил наибольшую кучку в раза. Тогда Ваня мог увеличить её еще в
раза и выиграть.
Рассмотрим неравенство:
Значит нам подходит значение . Рассматривать ход, когда Петя добавляет в кучу один камень бессмысленно, ведь
тогда нужно, чтобы в куче изначально лежало достаточно большое количество камней
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap, second_heap): # Функция игры if first_heap + second_heap >= 48: # Если камней в кучах стало больше 47 return 0 # Прекращаем игру moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap), 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,44): # если в данной позиции после неудачного хода Пети возможен выигрыш Вани if game(4+1,i) == 1 or game(4*2,i) == 1 or game(4,i+1) == 1 or game(4,i*2) == 1: print(i) break
Решение АР
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) >= 48: return ’END’ elif any(game(x) == ’END’ for x in moves(heap)): return ’P1’ elif any(game(x) == ’P1’ for x in moves(heap)): return ’V1’ elif any(game(x) == ’V1’ for x in moves(heap)): return ’P2’ elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)): return ’V2’ for s in range(1, 44): if game((4, s)) == ’V1’: print(s) break