В игре, описанной
Найдите такое значение S, при котором у Вани есть стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом.
Рассмотрим значение S = 20. Своим первым ходом Петя может получить позиции (39, 40), (40, 20), (41, 20) и (42, 20).
Приведем решение на языке Python.
def Win(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 0 if ma >= 48 or mi >= 48 else any([Lose(ma+i,mi,k-1) for i in range(1,4)] + [Lose(ma,mi*2,k-1)] if ma!=mi\
else [Lose(ma+i,mi,k-1) for i in range(1,4)])
def Lose(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 1 if ma >= 48 or mi >= 48 else 0 if not k else\
all([Win(ma+i,mi,k-1) for i in range(1,4)] + [Win(ma,mi*2,k-1)] if ma!=mi else [Win(ma+i,mi,k-1) for i in range(1,4)])
print('21)', *[s for s in range(1,48) if not Lose(39, s, 2) and Lose(39, s, 4)])
Ответ: 20.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней, не меньше одного камня в каждой. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в большую кучу любое количество камней от одного до трёх или удвоить количество камней в меньшей куче. Если кучи содержат равное количество камней, можно добавить в любую из них от одного до трёх камней, удвоение в этой ситуации запрещено.
Игра завершается в тот момент, когда количество камней в одной из куч
Такая ситуация возможна при S = 46. Могут быть кучи
Приведем решение на языке Python.
from itertools import product as p
def Win(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 0 if ma >= 48 or mi >= 48 else any([Lose(ma+i,mi,k-1) for i in range(1,4)] + [Lose(ma,mi*2,k-1)] if ma!=mi\
else [Lose(ma+i,mi,k-1) for i in range(1,4)])
def Lose(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 1 if ma >= 48 or mi >= 48 else 0 if not k else\
all([Win(ma+i,mi,k-1) for i in range(1,4)] + [Win(ma,mi*2,k-1)] if ma!=mi else [Win(ma+i,mi,k-1) for i in range(1,4)])
print('Задание 19:', min([x+y for x, y in p(range(1,48), repeat=2) if Win(x, y, 1)]))
Ответ: 46.
Приведем решение Даниила Травинова на языке Python.
def game(p1, p2, mov):
if (p1 >= 48 or p2 >= 48) and mov == 2:
return 1
elif mov > 2:
return 0
else:
if p1 > p2:
return game(p1 + 1, p2, mov + 1) or game(p1 + 2, p2, mov + 1) or game(p1 + 3, p2, mov + 1) or game(p1, p2 * 2, mov + 1)
elif p1 == p2:
return game(p1 + 1, p2, mov + 1) or game(p1 + 2, p2, mov + 1) or game(p1 + 3, p2, mov + 1) or game(p1, p2 + 1, mov + 1) or game(p1, p2 + 2, mov + 1) or game(p1, p2 + 3, mov + 1)
else:
return game(p1, p2 + 1, mov + 1) or game(p1, p2 + 1, mov + 1) or game(p1, p2 + 3, mov + 1) or game(p1 * 2, p2, mov + 1)
sum = float('inf')
for i in range(1, 47):
for j in range(1, 47):
if game(i, j, 1) == 1:
sum = min(sum, i + j)
print(sum)
В игре, описанной
Укажите минимальное и максимальное из таких
В ответе запишите сначала минимальное значение, затем максимальное.
Ответ:
Рассмотрим значение S = 26. Своим первым ходом Петя может получить позиции (26, 26), (13, 27), (13, 28) и (13, 29). К победе Петю приводит
Второе значение S — 43. Своим первым ходом Петя может получить позиции (26, 43), (13, 44) , (13, 45) и (13, 46). К победе Петю приводит
Приведем решение на языке Python.
def Win(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 0 if ma >= 48 or mi >= 48 else any([Lose(ma+i,mi,k-1) for i in range(1,4)] + [Lose(ma,mi*2,k-1)] if ma!=mi\
else [Lose(ma+i,mi,k-1) for i in range(1,4)])
def Lose(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 1 if ma >= 48 or mi >= 48 else 0 if not k else\
all([Win(ma+i,mi,k-1) for i in range(1,4)] + [Win(ma,mi*2,k-1)] if ma!=mi else [Win(ma+i,mi,k-1) for i in range(1,4)])
t = [s for s in range(1,48) if not Win(13, s, 1) and Win(13, s, 3)]; print('Задание 20:', min(t), max(t))
Ответ: 26 43.
В игре, описанной
Найдите такое
Рассмотрим значение S = 16. Своим первым ходом Петя может получить позиции (32, 31), (16, 32), (16, 33) и (16, 34). В позиции (32, 31) Ваня выигрывает первым ходом, увеличив количество камней в меньшей куче в два раза. При позиции (16, 32) Ваня делает позицию (32, 32), Петя может получить позиции (32, 33), (32, 34) и (32, 35), Ваня выигрывает, увеличив количество камней в меньшей куче в два раза. При позициях (16, 33) и (16, 34) Ваня делает позицию (16, 36), тогда Петя может получить позиции (32, 36), (16, 37), (16, 38) и (16, 39).
Приведем решение на языке Python.
def Win(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 0 if ma >= 40 or mi >= 40 else any([Lose(ma+i,mi,k-1) for i in range(1,4)] + [Lose(ma,mi*2,k-1)] if ma!=mi\
else [Lose(ma+i,mi,k-1) for i in range(1,4)])
def Lose(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 1 if ma >= 40 or mi >= 40 else 0 if not k else\
all([Win(ma+i,mi,k-1) for i in range(1,4)] + [Win(ma,mi*2,k-1)] if ma!=mi else [Win(ma+i,mi,k-1) for i in range(1,4)])
print('21)', *[s for s in range(1,40) if not Lose(31, s, 2) and Lose(31, s, 4)])
Ответ: 16.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней, не меньше одного камня в каждой. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в большую кучу любое количество камней от одного до трёх или удвоить количество камней в меньшей куче. Если кучи содержат равное количество камней, можно добавить в любую из них от одного до трёх камней, удвоение в этой ситуации запрещено. Игра завершается в тот момент, когда количество камней в одной из куч
Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?
Такая ситуация возможна при S = 38. Могут быть кучи
Приведем решение на языке Python.
from itertools import product as p
def Win(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 0 if ma >= 40 or mi >= 40 else any([Lose(ma+i,mi,k-1) for i in range(1,4)] + [Lose(ma,mi*2,k-1)] if ma!=mi\
else [Lose(ma+i,mi,k-1) for i in range(1,4)])
def Lose(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 1 if ma >= 40 or mi >= 40 else 0 if not k else\
all([Win(ma+i,mi,k-1) for i in range(1,4)] + [Win(ma,mi*2,k-1)] if ma!=mi else [Win(ma+i,mi,k-1) for i in range(1,4)])
print('Задание 19:', min([x+y for x, y in p(range(1,40), repeat=2) if Win(x, y, 1)]))
Ответ: 38.
В игре, описанной
Укажите минимальное и максимальное из таких
Ответ:
Рассмотрим значение S = 22. Своим первым ходом Петя может получить позиции (22, 22), (11, 23), (11, 24) и (11, 25). К победе Петю приводит
Второе значение S — 35. Своим первым ходом Петя может получить позиции (22, 35), (11, 36), (11, 37) и (13, 38). К победе Петю приводит
Приведем решение на языке Python.
def Win(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 0 if ma >= 40 or mi >= 40 else any([Lose(ma+i,mi,k-1) for i in range(1,4)] + [Lose(ma,mi*2,k-1)] if ma!=mi\
else [Lose(ma+i,mi,k-1) for i in range(1,4)])
def Lose(ma, mi, k):
ma, mi = max(ma, mi), min(ma, mi)
return 1 if ma >= 40 or mi >= 40 else 0 if not k else\
all([Win(ma+i,mi,k-1) for i in range(1,4)] + [Win(ma,mi*2,k-1)] if ma!=mi else [Win(ma+i,mi,k-1) for i in range(1,4)])
t = [s for s in range(1,40) if not Win(11, s, 1) and Win(11, s, 3)]; print('Задание 20:', min(t), max(t))
Ответ: 22 35.
Наверх

