На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Не зарегистрирован
ссылка на сообщение  Отправлено: 13.04.24 15:37. Заголовок: 21-135 задача


Здравствуйте.
У меня не сходится ответ в 21 задаче №135.

results = {}

def f (x, k):
if x in results:
return results[x]
if x >= 61:
return 0

nextcodes = []
if k - 1 >= 0:
nextcodes.append(f(x+1, k-1))
if k - x >= 0:
nextcodes.append(f(2*x, k-x))

negative = [i for i in nextcodes if i<=0]
if negative:
res = -max(negative)+1
else:
res = -max(nextcodes)
results[x] = res

return res

for i in range(1,62):
print(i, f(i, 80-i))

Позиция 28 проигрышная, но у второго игрока нет гарантии, что он выиграет своим вторым ходом. Если первый игрок походит в позицию 56, то проигрыш будет на 3 ходу. Не понятно, как думать в этом случае?

Спасибо: 0 
Цитата Ответить
Ответов - 1 [только новые]





Сообщение: 12
ссылка на сообщение  Отправлено: 13.04.24 23:32. Заголовок: не сходится ответ на 21 вопрос №135


Здравствуйте! У меня тоже не сходится ответ с данным номером.
При 28 Ваня своим 2-ым ходом не сможет победить, т.к. для осуществления хода *2 ему не хватит камней.
def f(s,m):
if s>=61:
return m%2==0
if m==0 :
return 0
h=[f(s+1,m-1)]
if s<=40:
h+=[ f(s*2,m-1)]
return any (h) if m % 2 !=0 else all(h)

print('№19 ответ:',len([s for s in range(1,61) if f (s,1)]))
print('№20 ответ:',[s for s in range(1,61) if not (f (s,1)) and f(s,3)])
print('№21 ответ:',[s for s in range(1,61) if not (f (s,2)) and f(s,4)])
print('***')
def f(h):
s,s1=h
a=[]
if s1>=1:
a.append((s+1,s1-1))
if s1>=s:
a.append((s*2,s1-s))
return a

from functools import*
@lru_cache(None)
def game(h):
s,s1=h
if s>=61:
return 'победа'
if any(game(n)=='победа' for n in f(h)):
return 'Петя 1'# 1-ый ход игры
if all(game(n)=='Петя 1' for n in f(h)):
return 'Ваня 1'# 2-ой ход игры
if any(game(n)=='Ваня 1' for n in f(h)):
return 'Петя 2'# 3-ий ход игры
if all(game(n)=='Петя 1' or game(n)=='Петя 2' for n in f(h)):
return 'Ваня 2'# 4-ый ход игры


print('ответ на номер 19:')
k=0
for s in range(1,61):
n=s,80-s
if game(n)=='Петя 1':
k+=1
print(s,game(n))
print(k)

print('ответ на номер 20:')
for s in range(1,61):
n=s,80-s
if game(n)=='Петя 2':
print(s,game(n))

print('ответ на номер 21:')
for s in range(1,61):
n=s,80-s
if game(n)=='Ваня 2':
print(s,game(n))
ВЫВОД:
№19 ответ: 11
№20 ответ: [15, 29, 58]
№21 ответ: [57]
***
ответ на номер 19:
31 Петя 1
32 Петя 1
33 Петя 1
34 Петя 1
35 Петя 1
36 Петя 1
37 Петя 1
38 Петя 1
39 Петя 1
40 Петя 1
60 Петя 1
11
ответ на номер 20:
15 Петя 2
29 Петя 2
58 Петя 2
ответ на номер 21:
57 Ваня 2

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1231
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет