Для игры, описанной в задании 19, найдите минимальное значение S, при котором у Вани есть стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволила бы ему гарантированно выиграть первым ходом.
Приведём решение на языке Python.
def f(x, h):
delit = [k for k in range(2, 10) if x % k == 0]
if x <= 15:
return h % 2 == 0
elif h == 0:
return 0
elif not any(x % k == 0 for k in range(2, 10)):
x -= 1
elif (h-1)%2 ==0:
return any(f(x-k, h-1) for k in delit)
else:
return all(f(x-k, h-1) for k in delit)
for x in range(16, 100):
if not (f(x,2)) and f(x,4):
print('Задача 21:',x)
break
Ответ: 26.
Приведем решение Маргариты Фалько на языке Python.
def divisor(s):
for i in range(2, s+1):
if s % i == 0:
break
return 2 <= i <= 9
def g(s, p, end):
if s <= 15: return p in end
if p > max(end): return False
if not divisor(s):
s -= 1
moves = [g(s-k, p+1, end) for k in range(2, 10) if s % k == 0]
else:
moves = [g(s-k, p+1, end) for k in range(2, 10) if s % k == 0]
return any(moves) if ((p+1) % 2) == (end[0] % 2) else all(moves)
print('19', [s for s in range(16, 100) if g(s, 0, [2])])
print('20', [s for s in range(16, 100) if g(s, 0, [3]) and not g(s, 0, [1])])
print('21', [s for s in range(16, 100) if g(s, 0, [2, 4]) and not g(s, 0, [2])])

