Задания
Версия для печати и копирования в MS Word
Тип 21 № 75258
i

Для игры, опи­сан­ной в за­да­нии 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])])


Аналоги к заданию № 75258: 75285 Все