Для игры, описанной
В ответе запишите найденные значения в порядке возрастания.
Ответ:
Первое такое значение S — 57. Своим первым ходом Петя может получить позиции
Второе такое значение S — 62. Своим первым ходом Петя может получить
Приведём решение на языке Python.
def f(x, h):
if x >= 96:
return h % 2 == 0
if h == 0:
return 0
c = [f(x + 1, h - 1)]
if x % 2 == 0:
c += [f(x *3 // 2, h - 1)]
if x % 3 == 0:
c += [f(x *4 // 3, h - 1)]
if x % 2 != 0 and x % 3 != 0:
c += [f(x * 2, h - 1)]
return any (c) if h % 2 != 0 else all(c)
count = 0
for x in range(96, 1, -1):
if f(x, 3) == 1 and f(x,1) == 0:
count += 1
print("Задача 20: ", x)
if count == 2:
break
Приведём решение Сергея Гусарова на языке Python.
def f(s,p,k):
if p > k:
return False
if s >= 96 and p%2 == 0:
return False
if s >= 96 and p%2 == 1:
return True
if s < 96 and p%2 == 1:
if s%6 == 0:
return f(s + s//2, p+1,k) and f(s + s//3,p+1,k) and f(s+1,p+1,k)
elif s%2 == 0:
return f(s + s//2, p+1,k) and f(s+1,p+1,k)
elif s%3 == 0:
return f(s + s//3,p+1,k) and f(s+1,p+1,k)
else:
return f(s*2, p+1,k) and f(s+1,p+1,k)
if s < 96 and p%2 == 0:
if s%6 == 0:
return f(s + s//2, p+1,k) or f(s + s//3,p+1,k) or f(s+1,p+1,k)
elif s%2 == 0:
return f(s + s//2, p+1,k) or f(s+1,p+1,k)
elif s%3 == 0:
return f(s + s//3,p+1,k) or f(s+1,p+1,k)
else:
return f(s*2, p+1,k) or f(s+1,p+1,k)
d = []
d2 = []
for s in range(1,95):
if f(s,0,1):
d.append(s)
for s in range(1,95):
if f(s,0,3) and s not in d:
d2.append(s)
print(*d2[-2:])
Решим задание с помощью электронных таблиц.
Скопируем решение
В ячейку H3 — ход =G3+1.
В ячейку H19 — ход =ЕСЛИ(ОСТАТ(G3;2)=0;G3+G3*0,5;-1000).
В ячейку H35 — ход =ЕСЛИ(ОСТАТ(G3;3)=0;G3+G3*1/3;-1000).
В ячейку H15 — ход =ЕСЛИ(И(ОСТАТ(G3;2)<>0;ОСТАТ(G3;3)<>0);G3*2;-1000).
Меняя значение
Получим следующую таблицу и подходящие значения 57&62.
Ответ: 57&62.
Приведём решение Юрия Красильникова на языке Python.
def game(n,lim,s): # номер хода, лимит ходов, количество камней
player=2-n%2 # текущий игрок
rival=3-player # противник
if s >= 96: return rival # игра закончена
if n > lim: return 0 # превышен лимит ходов - победителя нет
pos=[s+1] # количество камней после хода игрока
if s%2 == 0: pos.append(s+s//2)
if s%3 == 0: pos.append(s+s//3)
if s%2 != 0 and s%3 != 0: pos.append(s*2)
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(1,96) if game(1,2,s) == 2])
print('#20:',*[s for s in range(1,96) if game(1,2,s) == 0 and game(1,3,s) == 1])
print('#21:',*[s for s in range(1,96) if game(1,3,s) == 0 and game(1,4,s) == 2])

