Для игры, описанной в задании 19, найдите два наименьших значения S, при которых Петя не может выиграть первым ходом, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Вани. В ответе запишите найденные значения в порядке возрастания.
Приведём решение на языке Python.
def f(x,k,v):
if x <= 19:
return k in v
if k >= max(v):
return 0
h = [f(x-1,k+1,v)]
if x % 3 == 0:
h.append(f(x//3,k+1,v))
else:
h.append(f(x-2,k+1,v))
if x % 5 == 0:
h.append(f(x//5,k+1,v))
else:
h.append(f(x-3,k+1,v))
if k%2 != max(v) % 2:
return any(h)
else:
return all(h)
for x in range (19,1000):
if f(x,0,[1,3]) == 1 and f(x,0,[1]) == 0:
print('Задание 20:',x)
Ответ: 26&69.
Приведём решение Юрия Красильникова на языке Python.
def game(n,lim,s): # номер хода, лимит ходов, количество камней
player=2-n%2 # текущий игрок
rival=3-player # противник
if s <= 19: return rival # игра закончена
if n > lim: return 0 # превышен лимит ходов - победителя нет
pos=[s-1, s//3 if s%3==0 else s-2, s//5 if s%5==0 else s-3] # количество камней после хода игрока
res=[game(n+1,lim,p) for p in pos] # результаты ходов
if all([r == rival for r in res]): return rival # все ходы проигрышные
if any([r == player for r in res]): return player # есть выигрышный ход
return 0 # победителя нет
print('#19:',*[s for s in range(20,100) if game(1,2,s) == 2])
print('#20:',*[s for s in range(20,100) if game(1,2,s) == 0 and game(1,3,s) == 1])
print('#21:',*[s for s in range(20,100) if game(1,3,s) == 0 and game(1,4,s) == 2 and game(1,4,s) == 2])

