В игре, описанной
В ответе запишите сначала минимальное значение, затем максимальное.
Рассмотрим значение S = 24. Своим первым ходом Петя может получить позиции (6, 24), (7, 24), (8, 24), (9, 24) и (10, 24). К победе Петю приводит позиция (10, 24). Сколько бы камней не добавил Ваня, он не сможет получить
Второе значение S — 33. Своим первым ходом Петя может получить позиции (6, 33), (7, 33), (8, 33), (9, 33) и (10, 33). К победе Петю приводит
Ответ: 24 и 33.
Приведём решение Дмитрия Пехова на языке Python.
def f(a,b,m):
if a+b >= 46:
return m%2==0
if m==0:
return 0
h = []
if a <= b:
for i in range(1,a+1):
h.append(f(a+i,b,m-1))
else:
for i in range(1,b+1):
h.append(f(a,b+i,m-1))
if (m-1)%2==0:
return any(h)
else:
return all(h)
print('19)', min([s1 + s2 for s1 in range(1,46) for s2 in range(1,46) if f(s1,s2,1)]))
print('20)', min([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))
print('20)', max([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))
print('21)', min([s2 for s2 in range(1,41) if not f(5,s2,2) and f(5,s2,4)]))
Приведём решение Юрия Красильникова на языке Python.
def ход(номер,лимит,позиция):
игрок=2-номер%2
враг=3-игрок
if sum(позиция)>=46: return враг
if номер>лимит: return 0
куча1,куча2=позиция
if куча1<куча2: позиции=[(куча1+добавка,куча2) for добавка in range(1,куча1+1)]
else: позиции=[(куча1,куча2+добавка) for добавка in range(1,куча2+1)]
результаты=[ход(номер+1,лимит,поз) for поз in позиции]
if any(рез==игрок for рез in результаты): return игрок
if all(рез==враг for рез in результаты): return враг
return 0
print('#19:',min([куча1+куча2 for куча1 in range(1,44) for куча2 in range(1,44) if ход(1,1,(куча1,куча2))==1]))
print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,1,(5,куча2))==0 and ход(1,3,(5,куча2))==1])
print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,2,(5,куча2))==0 and ход(1,4,(5,куча2))==2])
Приведём решение Юрия Ворошилова на языке Python.
def f(x,y,n):
if x+y>=46 and n==3:
return 1
if x+y>=46 and n==1:
return 0
if x+y<46 and n==3:
return 0
if x+y>=46 and n%2==0:
return 0
if x+y<46 and n%2==1:
a=[]
if x < y:
for i in range(1,x+1): a.append(f(x+i, y, n+1))
else:
for i in range(1,y+1): a.append(f(x, y+i, n+1))
return all(a)
if x+y < 46 and n%2==0:
a=[]
if x < y:
for i in range(1,x+1): a.append(f(x+i, y, n+1))
else:
for i in range(1,y+1): a.append(f(x, y+i, n+1))
return any(a)
for y in range(1,41):
if f(5, y, 0):
print(y)
Приведём решение Маргариты Фалько на языке Python.
def g(s1, s2, p, end):
if s1 + s2 > 45: return p in end
if p > max(end): return False
moves1 = [g(s1+i, s2, p+1, end) for i in range(1, s1+1) if s1 <= s2]
moves2 = [g(s1, s2+i, p+1, end) for i in range(1, s2+1) if s2 <= s1]
moves = moves1 + moves2
return any(moves) if ((p+1) % 2) == (end[0] % 2) else all(moves)
print('Задание 19:', min([s1+s2 for s1 in range(1,44) for s2 in range(1,44) if g(s1, s2, 0, [1])]))
res_20 = [s1 for s1 in range(1,44) if g(s1, 5, 0, [1, 3]) and not g(s1, 5, 0, [1])]
print('Задание 20:', min(res_20), max(res_20))
print('Задание 21:', min([s1 for s1 in range(1,40) if g(s1, 5, 0, [2, 4]) and not g(s1, 5, 0, [2])]))
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в меньшую кучу любое количество камней от одного до количества камней в этой куче. Изменять количество камней в большей куче не разрешается. Если кучи содержат равное количество камней, добавлять камни можно в любую из них. Пусть, например, в начале игры в первой куче
Игра завершается, когда общее количество камней в кучах становится
Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?
Пусть S — сумма камней в обеих кучах. Такая ситуация возможна при S = 31, при этом в одной из куч должно быть
Ответ: 31.
Приведём решение Дмитрия Пехова на языке Python.
def f(a,b,m):
if a+b >= 46:
return m%2==0
if m==0:
return 0
h = []
if a <= b:
for i in range(1,a+1):
h.append(f(a+i,b,m-1))
else:
for i in range(1,b+1):
h.append(f(a,b+i,m-1))
if (m-1)%2==0:
return any(h)
else:
return all(h)
print('19)', min([s1 + s2 for s1 in range(1,46) for s2 in range(1,46) if f(s1,s2,1)]))
print('20)', min([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))
print('20)', max([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))
print('21)', min([s2 for s2 in range(1,41) if not f(5,s2,2) and f(5,s2,4)]))
Приведём решение Юрия Красильникова на языке Python.
def ход(номер,лимит,позиция):
игрок=2-номер%2
враг=3-игрок
if sum(позиция)>=46: return враг
if номер>лимит: return 0
куча1,куча2=позиция
if куча1<куча2: позиции=[(куча1+добавка,куча2) for добавка in range(1,куча1+1)]
else: позиции=[(куча1,куча2+добавка) for добавка in range(1,куча2+1)]
результаты=[ход(номер+1,лимит,поз) for поз in позиции]
if any(рез==игрок for рез in результаты): return игрок
if all(рез==враг for рез in результаты): return враг
return 0
print('#19:',min([куча1+куча2 for куча1 in range(1,44) for куча2 in range(1,44) if ход(1,1,(куча1,куча2))==1]))
print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,1,(5,куча2))==0 and ход(1,3,(5,куча2))==1])
print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,2,(5,куча2))==0 and ход(1,4,(5,куча2))==2])
Приведём решение Юрия Ворошилова на языке Python.
def f(x,y,n):
if x+y >= 46 and n==1:
return 1
if x+y < 46 and n==1:
return 0
if x+y >= 46 and n%2==0:
return 0
if x+y < 46 and n%2==1:
a=[]
if x < y:
for i in range(1,x+1): a.append(f(x+i, y, n+1))
else:
for i in range(1,y+1): a.append(f(x, y+i, n+1))
return all(a)
if x+y < 46 and n%2==0:
a=[]
if x < y:
for i in range(1,x+1): a.append(f(x+i, y, n+1))
else:
for i in range(1,y+1): a.append(f(x, y+i, n+1))
return any(a)
mn = 46
for x in range(1,46):
for y in range(1,46):
if f(x, y, 0): mn=min(mn, x+y)
print(mn)
Приведём решение Маргариты Фалько на языке Python.
def g(s1, s2, p, end):
if s1 + s2 > 45: return p in end
if p > max(end): return False
moves1 = [g(s1+i, s2, p+1, end) for i in range(1, s1+1) if s1 <= s2]
moves2 = [g(s1, s2+i, p+1, end) for i in range(1, s2+1) if s2 <= s1]
moves = moves1 + moves2
return any(moves) if ((p+1) % 2) == (end[0] % 2) else all(moves)
print('Задание 19:', min([s1+s2 for s1 in range(1,44) for s2 in range(1,44) if g(s1, s2, 0, [1])]))
res_20 = [s1 for s1 in range(1,44) if g(s1, 5, 0, [1, 3]) and not g(s1, 5, 0, [1])]
print('Задание 20:', min(res_20), max(res_20))
print('Задание 21:', min([s1 for s1 in range(1,40) if g(s1, 5, 0, [2, 4]) and not g(s1, 5, 0, [2])]))
В игре, описанной
Найдите минимальное из таких значений S, при котором у Вани есть стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом.
Такое значение S — 20. При S = 20 Петя своим первым ходом может получить позиции (6, 20), (7, 20), (8, 20), (9, 20) и
Ответ: 20.
Приведём решение Дмитрия Пехова на языке Python.
def f(a,b,m):
if a+b >= 46:
return m%2==0
if m==0:
return 0
h = []
if a <= b:
for i in range(1,a+1):
h.append(f(a+i,b,m-1))
else:
for i in range(1,b+1):
h.append(f(a,b+i,m-1))
if (m-1)%2==0:
return any(h)
else:
return all(h)
print('19)', min([s1 + s2 for s1 in range(1,46) for s2 in range(1,46) if f(s1,s2,1)]))
print('20)', min([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))
print('20)', max([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))
print('21)', min([s2 for s2 in range(1,41) if not f(5,s2,2) and f(5,s2,4)]))
Приведём решение Юрия Красильникова на языке Python.
def ход(номер,лимит,позиция):
игрок=2-номер%2
враг=3-игрок
if sum(позиция)>=46: return враг
if номер>лимит: return 0
куча1,куча2=позиция
if куча1<куча2: позиции=[(куча1+добавка,куча2) for добавка in range(1,куча1+1)]
else: позиции=[(куча1,куча2+добавка) for добавка in range(1,куча2+1)]
результаты=[ход(номер+1,лимит,поз) for поз in позиции]
if any(рез==игрок for рез in результаты): return игрок
if all(рез==враг for рез in результаты): return враг
return 0
print('#19:',min([куча1+куча2 for куча1 in range(1,44) for куча2 in range(1,44) if ход(1,1,(куча1,куча2))==1]))
print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,1,(5,куча2))==0 and ход(1,3,(5,куча2))==1])
print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,2,(5,куча2))==0 and ход(1,4,(5,куча2))==2])
Приведём решение Юрия Ворошилова на языке Python.
def f(x,y,n):
if x+y >= 46 and n%2==0:
return 1
if x+y < 46 and n==4:
return 0
if x+y >= 46 and n%2==1:
return 0
if x+y < 46 and n%2==0:
a=[]
if x < y:
for i in range(1,x+1): a.append(f(x+i, y, n+1))
else:
for i in range(1,y+1): a.append(f(x, y+i, n+1))
return all(a)
if x+y < 46 and n%2==1:
a=[]
if x < y:
for i in range(1,x+1): a.append(f(x+i, y, n+1))
else:
for i in range(1,y+1): a.append(f(x, y+i, n+1))
return any(a)
for y in range(1,41):
if f(5, y, 0):
print(y)
Приведём решение Маргариты Фалько на языке Python.
def g(s1, s2, p, end):
if s1 + s2 > 45: return p in end
if p > max(end): return False
moves1 = [g(s1+i, s2, p+1, end) for i in range(1, s1+1) if s1 <= s2]
moves2 = [g(s1, s2+i, p+1, end) for i in range(1, s2+1) if s2 <= s1]
moves = moves1 + moves2
return any(moves) if ((p+1) % 2) == (end[0] % 2) else all(moves)
print('Задание 19:', min([s1+s2 for s1 in range(1,44) for s2 in range(1,44) if g(s1, s2, 0, [1])]))
res_20 = [s1 for s1 in range(1,44) if g(s1, 5, 0, [1, 3]) and not g(s1, 5, 0, [1])]
print('Задание 20:', min(res_20), max(res_20))
print('Задание 21:', min([s1 for s1 in range(1,40) if g(s1, 5, 0, [2, 4]) and not g(s1, 5, 0, [2])]))
В игре, описанной
Укажите минимальное и максимальное из таких значений S, при которых Петя не может выиграть первым ходом, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Вани.
В ответе запишите сначала минимальное значение, затем максимальное.
Ответ:
Рассмотрим значение S = 22. Своим первым ходом Петя может получить позиции (5, 22), (6, 22), (7, 22) и (8, 22). К победе Петю приводит
Второе значение S — 29. Своим первым ходом Петя может получить позиции (5, 29), (6, 29), (7, 29), и (8, 29). К победе Петю приводит
Ответ: 22 29.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в меньшую кучу любое количество камней от одного до количества камней в этой куче. Изменять количество камней в большей куче не разрешается. Если кучи содержат равное количество камней, добавлять камни можно в любую из них. Пусть, например, в начале игры в первой куче
Игра завершается, когда общее количество камней в кучах становится
Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?
Пусть S — сумма камней в обеих кучах. Такая ситуация возможна при S = 27, при этом в одной из куч должно быть
Ответ: 27.
Приведём решение Михаила Глинского на языке Python.
def F(x,y,n):
if n == 1 and x + y > 39:
return True
if n==1 and x + y <= 39:
return False
else:
if x < y:
return F(x + x,y,n + 1)
else:
return F(x,y + y,n + 1)
m = []
for x in range(20):
for y in range(20):
if F(x , y , 0)==True:
m.append(x + y)
print(min(m))
В игре, описанной в задании 19, в начальный момент в первой куче было
Найдите минимальное из таких
Такое значение S — 18. При S = 18 Петя своим первым ходом может получить позиции (5, 18), (6, 18), (7, 18), и (8, 18). Чтобы гарантированно выиграть, Ваня должен получить
Ответ: 18.
Приведём решение Павела Муленко на языке Python.
def game (n,S1,S2): #S1 -- меньшее из двух количеств
if(n>4):
return 0
if(n<4) and (S1+S2>39):
return 0
if (n==4) and (S1+S2>39):
return 1
if (n==4) and (S1+S2<=39):
return 0
if(n%2==1):
temp = game(n+1,min(S1+1,S2),max(S1+1,S2))
for i in range(2,S1+1):
temp = temp or game(n+1,min(S1+i,S2),max(S1+i,S2))
return temp
else:
temp = game(n+1,min(S1+1,S2),max(S1+1,S2))
for i in range(2,S1+1):
temp = temp and game(n+1,min(S1+i,S2),max(S1+i,S2))
return temp
for S in range(1,36):
if (game(0,min(S,4),max(S,4))==1):
print(S)
Наверх

