Для правил, описанных в задании известно, что
,
,
.
Кто побеждает при правильной игре? В ответе запишите номер игрока.
Ходы для каждого из игроков различны, значит стоит рассматривать выигрышные проигрышные позиции для двух игроков. Иначе говоря, считать не стандартные state[x][y], а state[x][y][type]. Анализ позиций приводит к ответу: выигрывает второй. Позиция S = 20, для первого игрока является позицией типа LOSE5
from functools import lru_cache
def h1(n):
if (n >= 10):
return n - 1, n - 10
else:
return n - 1, n - 1
def h2(n):
if (n >= 3):
return n - 2, n - 3
else:
return n - 2, n - 2
@lru_cache(None)
def f1(n):
if (n == 0):
return ’END’
if (any(f2(x) == ’END’ for x in h1(n))):
return ’WIN1’
if (all(f2(x) == ’WIN1’ for x in h1(n))):
return ’LOSE1’
if (any(f2(x) == ’LOSE1’ for x in h1(n))):
return ’WIN2’
if (all(f2(x) == ’WIN1’ or f2(x) == ’WIN2’ for x in h1(n))):
return ’LOSE2’
if (any(f2(x) == ’LOSE2’ for x in h1(n))):
return ’WIN3’
if (all(f2(x) == ’WIN1’ or f2(x) == ’WIN2’ or
f2(x) == ’WIN3’ for x in h1(n))):
return ’LOSE3’
if (any(f2(x) == ’LOSE3’ for x in h1(n))):
return ’WIN4’
if (all(f2(x) == ’WIN1’ or f2(x) == ’WIN2’
or f2(x) == ’WIN3’ or f2(x) == ’WIN4’ for x in h1(n))):
return ’LOSE4’
if (any(f2(x) == ’LOSE4’ for x in h1(n))):
return ’WIN5’
if (
all(f2(x) == ’WIN1’ or f2(x) == ’WIN2’ or f2(x) == ’WIN3’
or f2(x) == ’WIN4’ or f2(x) == ’WIN5’ for x in
h1(n))):
return ’LOSE5’
if (any(f2(x) == ’LOSE5’ for x in h1(n))):
return ’WIN6’
@lru_cache(None)
def f2(n):
if (n < 2):
return ’END’
if (any(f1(x) == ’END’ for x in h2(n))):
return ’WIN1’
if (all(f1(x) == ’WIN1’ for x in h2(n))):
return ’LOSE1’
if (any(f1(x) == ’LOSE1’ for x in h2(n))):
return ’WIN2’
if (all(f1(x) == ’WIN1’ or f1(x) == ’WIN2’ for x in h2(n))):
return ’LOSE2’
if (any(f1(x) == ’LOSE2’ for x in h2(n))):
return ’WIN3’
if (all(f1(x) == ’WIN1’ or f1(x) == ’WIN2’ or
f1(x) == ’WIN3’ for x in h2(n))):
return ’LOSE3’
if (any(f1(x) == ’LOSE3’ for x in h2(n))):
return ’WIN4’
if (all(f1(x) == ’WIN1’ or f1(x) == ’WIN2’ or f1(x) == ’WIN3’ or
f1(x) == ’WIN4’ for x in h2(n))):
return ’LOSE4’
if (any(f1(x) == ’LOSE4’ for x in h2(n))):
return ’WIN5’
if (
all(f1(x) == ’WIN1’ or f1(x) == ’WIN2’ or f1(x) == ’WIN3’ or
f1(x) == ’WIN4’ or f1(x) == ’WIN5’ for x in
h2(n))):
return ’LOSE5’
if (any(f1(x) == ’LOSE5’ for x in h2(n))):
return ’WIN6’
print(f1(20))
Ответ: 2