Алексей, вечер добрый! Не знаю актуально или нет, но можно под косячит Петя или нет ввести параметр, который по умолчанию принимает значение 0 (не косясит) def fn(s, m, n=0): тогда последняя строчка примет вид return any(h) if (m - 1) % 2 == 0 else all(h) if n == 0 else any(h)
Переписал под другую задачу и выдаёт ошибку в 5-ой строке. Написано: expected 'else' after 'if' expression. Вообще не получается устранить проблему. Решаю задачу 12108 КЭГЭ...
@@kompege Алексей, простите, я невнимательный человек... Всё супер, всё получилось, код реально работает и шаблон очень маленький, легко запомнить, спасибо за труд!!!!♥️♥️♥️♥️
в чем проблема? ответ не совпадает. условия стандартные def f(a,b,m): if a+b>=144: return m%2==0 if m == 0: return 0 h = [f(a + 1,b,m-1), f(a * 2,b,m-1), f(a,b+1,m-1), f(a,b*2,m-1)] return any(h) if (m-1)%2==0 else all(h) print('19)',[s for s in range(1,142) if f(s,2,2)]) print([s for s in range(1,142) if (not f(2,s,1)) and f(2,s,3)]) print([s for s in range(1,142) if (not f(s,2,2)) and f(s,2,4)])
Веб актуален? Просто он с КЕГЭ убран, а в начале веба, который там есть сказано, что в нём только интересные задания. Если тут базовые, то надо же начинать с них, но тогда почему его нет на КЕГЭ?
Это просто нечто, спасибо! Спасибо за всё, что вы делаете, ваши вебы и наикрутейший сайт невероятно помогли мне и огромному количеству 11-классников по всей России, я просто невероятно благодарна вам за такое количество полезного материала в открытом доступе, разобранного максимально понятно. Успехов вам и всего наилучшего!
в школе учили экселем, репетитор учил ручками) если одну кучу руками еще можно, то с двумя как карта ляжет: не всегда в нужное русло силы направишь, потратишь еще больше времени) а с питоном все проще и, как мне кажется, понятнее) про эксель вообще молчу: там пока таблицы построишь, уже минут 5 потратишь
ааааааа это такая имба!!! код максимально короток, но при этом так много смысла. стоит лишь 1 раз понять его принцип, и это в разы ускоряет решение, нежели решать другим кодом. Алексей, спасибо!
просто нужно понимать - мы не отвечаем за ход соперника, поэтому должны учесть оба его хода ( 2 true ), но когда наступает наш ход - достаточно и 1 (1-2 true) правильного возможного ответвления (хода) ?
Как я понял суть any и all в том, что any применяется условно на нашем ходу и это означает, что если мы подумаем, то найдём хотя бы один путь к победе и конечно же выберем его, а all для противника означает, что он в безвыходной ситуации и ВСЕ его ходы приведут к поражению(нашей победе) и всё это работает на m==0 или на m%2==0 в зависимости от того, результат какого игрока нам нужен Подскажите, верно ли я всё понял 🙃
Здравствуйте! Стоит ли ожидать задачу с двумя кучами на основной волне и в резерве 23 года? Заметил тенденцию, что остались только задачки с одной кучей, причем и в официальных вариантах, и в авторских вариантах на кегэ.
Почему на 39:10 мы вписываем, что у Вани нет победы первым ходом, если у него нет лишь стратегии гарантированной победы? То есть в отличии от 2 вопроса, где нам чётко обозначено, что "Петя не может выиграть за один ход", в 3 вопросе сказано, что Ваня МОЖЕТ победить и за один ход тоже, просто не обязательно. Запутался на этом моменте. Условия разные у 2 и 3 вопросов, а запись по итогу одна и та же.
1:10:57 - можно переделать возвращаемое значение функции проигравшего в нашу программу без смены all на any! Тем самым выполнить 3 условие 21 задания и эта переделка не повлияет на ответы предыдущих заданий. #Проверка ходов (1) (две кучи камней) def Win(c, d, l): return 0 if c==d else any([Lose(min(c,d)+1,max(c,d),l-1)[0], Lose(min(c,d)+3,max(c,d),l-1)[0]]) def Lose(a, b, k): return [1] if a==b else [0] if not k else [all([Win(min(a,b)+1,max(a,b),k-1), Win(min(a,b)+3,max(a,b),k-1)]), [Win(min(a,b)+1,max(a,b),k-1), Win(min(a,b)+3,max(a,b),k-1)]] print(min([i for i in range(1, 24) if i!=13 and Lose(13, i, 2)[0]]))#9 print(*[i for i in range(1, 24) if not Win(13, i, 1) and Win(13, i, 3)][:2])#6, 8 print(*[i for i in range(1, 24) if i!=13 and all((not Lose(13, i, 2)[0], Lose(13, i, 4)[0], True in Lose(13, i, 2)[1]))])#7, 19 1:29:00 - всё тоже самое только для одной кучи камней! #Проверка ходов (2) (одна куча камней) def Win(m, l): return [0] if m>=41 else [any([Lose(m+1,l-1), Lose(m+2,l-1)]),[Lose(m+1,l-1), Lose(m+2,l-1)]] if 50-m*2=41 else 0 if not k else all([Win(n+1,k-1)[0], Win(n+2,k-1)[0]]) if 50-n*2=45 else any([Lose(c+2,d,l-1), Lose(c,d+2,l-1), Lose(c*3,d,l-1), Lose(c,d*3,l-1)]) def Lose(a, b, k): return 1 if a+b>=45 else 0 if not k else all([Win(a+2,b,k-1), Win(a,b+2,k-1), Win(a*3,b,k-1), Win(a,b*3,k-1)]) print(len([(x,y) for x in range(1,44) for y in range(1,44) if x+y=71 else any([Lose(e+3,f,g,l-1)[0],Lose(e,f+3,g,l-1)[0],Lose(e,f,g+3,l-1)[0], Lose(e*2,f,g,l-1)[0], Lose(e,f*2,g,l-1)[0],Lose(e,f,g*2,l-1)[0]]) def Lose(a, b, c, k): return [1] if a+b+c>=71 else [0] if not k else [all([Win(a+3,b,c,k-1),Win(a,b+3,c,k-1),Win(a,b,c+3,k-1), Win(a*2,b,c,k-1),Win(a,b*2,c,k-1),Win(a,b,c*2,k-1)]), [Win(a+3,b,c,k-1),Win(a,b+3,c,k-1),Win(a,b,c+3,k-1), Win(a*2,b,c,k-1),Win(a,b*2,c,k-1),Win(a,b,c*2,k-1)]] print(min([i for i in range(1,59) if any(Lose(7, 5, i, 2)[1])]))#15 t = [i for i in range(1,59) if not Win(7, 5, i, 1) and Win(7, 5, i, 3)]; print(min(t), max(t))#14, 27 print(*[i for i in range(1,59) if not Lose(7, 5, i, 2)[0] and Lose(7, 5, i, 4)[0]])#24
Здравствуйте, у вас некрректно записано условие для дна рекурсии, вы сами в начале ролика говорили, что нужно писать m == 0, чтобы мы находили факт победы на конкретном ходу. Именно этого от нас требовали условия задач, но вы писали m % 2 == 0. Рассмотрим пример: в куче 10 камней, конец игры наступает, когда количество камней в куче превысило 19, у нас есть операции: умножить на два или умножить на 3. Мы спрашиваем программу: можем ли мы выиграть третьим ходом? Она выдаст "да", но это неверно. P.S. Я не путаю с задачами где формулировка была: может ли игрок х выиграть за у ходов(там корректно условие m % 2 == 0)
Здравствуйте, не могли бы вы мне подсказать, Я правильно понимаю что если победа не гарантирована первым ходом, это значит что можно выиграть гарантировано первым ходом при неудачном ходе соперника?
9:10 -Правильно ли будет сказать, что завершающему игроку, чтобы выиграть, достаточно чтобы один из ходов был выигрышным, но другому игроку, для того чтобы выиграть из этой позиции, нужно чтобы любой из его ходов привел к победе?
привет,можно на задаче которая на 1:27 где кучи должны быть равны написать вторую функцию такуюже только all поменять на any и добавить в условие тогда оно тоже выдаёт правильный ответ и нет проблем def f(a,b,m): if a==b:return m%2==0 if m==0:return 0 if a
Здравствуйте, Алексей. Объясните, пожалуйста, почему для возвращения тру должно выполняться условие m%2==0, то есть четный ход, если ход Пети, например, нечетный? Или в процессе выполнения функции у них ходы как-то меняются с четного на нечетный и в итоге и у Пети и у Вани выигрышный ход обязательно будет четным? Тока не пойму как 🧐
Там отсчёт же в минус идёт, и поэтому неважно, с чётного или нечётного мы начинали. В обоих случаях игра должна заканчиваться, когда от счётчика осталось 0 ходов, 2 хода и т д.
Если в виде графа выведешь, то с обратных узлов рекурсии, самые последние узлы при m = 0 true выдают. И чередуется в обратную сторону, помечая победные кучи целевого игрока. Я тут дерево рисовал, я бы отправил, но тут нельзя.
1:36:58 чоза ноль там, он что-то значит? там просто такой пик пересматриваемости просто, сам возвращаюсь к этому моменту и пока что пришёл к тому, что это написано для того, чтобы не удалять if not f().
1:32:15 не понимаю как решать задачи с условием например "увеличить количество камней в первой куче в два раза или увеличить количество камней во второй куче в три раза" если нет условия про общий запас
Здравствуйте, а почему нельзя писать if p='+1': h=[f(s+2, m-1,'+2'), f(s*2, m-1,'*2')] ( у меня выдал ошибку),а через if p!='+1':h+=[f(s+1, m-1,'+1')] не было никакой ошибки?
если умеете иными способами решать, и есть понимание работы программы, то блок "Как работает функция наглядно", можете скипать. ничего нового не узнаете. имхо, утомляет сильно
Алексей, 1:45:38 не могли брать range(1,44), потому что если в одной из куч будет 43 камня, не выполнится условие для другой кучи k>=1 и s>=1, потому что тогда там должно будет быть 0 камней. хотя с диапазоном (1,43) Ответ тот же
А как быть с условием для 2 кучек "Известно, что Ваня выиграл своим первым ходом после первого хода Пети. Назовите минимальное значение S, при котором это возможно." У меня ничего не выводит. Задача 4035 с сайта К.Ю.Полякова. Руками решил, долго но все же решилось. Хотелось бы кодом попробовать
@@kompege any ничего не дает. Видел с одной кучей проверку на нечетность. Приобщил эту прогу к 2 кучам но пока только добился ответа на 19 ) на 20 21 мимо
Алексей Михайлович, здравствуйте! Такой вопрос: Какова вероятность, что ТИ могут выдать не стандартную? то есть какой то тип с заощеренным условием или типо того, мне кажется многие завалятся на этом моменте используя дэфолтную прогу :{
Здравствуйте, Алексей! На основе вашего обновлённого кода пытаюсь решить другое задание на 3 кучи с сайта Полякова (№4207) , а именно 3-й вопрос. Он звучит так: "Найдите два значения S, при которых выигрышная стратегия есть у Вани, но Петя может выбрать, каким ходом выиграет Ваня - первым или вторым." Ответ: 10 13; у меня выводит 7 10 13. Подскажите, пожалуйста, что нужно изменить в коде, по сравнению с задачей из видео (числа другие я поставил)?
@@apyl1463 Действительно, сначала подумал, условия что он прописывает дальше решают эту проблему но нет. нельзя выиграть за 0 ходов Значит изначально камней не может быть >44 А значит в сумме их 44камней Скорее всего Алексей забыл про условие.
Это ходы всех игроков вместе взятых. Их количество задаётся в функции и уменьшается с каждым ходом каждого игрока. А так как игроков два, то чтобы узнать на чьём ходу закончилась игра, это m надо проверить на чётность.
Здравствуйте. Разобралась с кодом для одной кучи камней. Пыталась изменить его под условие: "При этом нельзя повторять ход, который этот же игрок делал на предыдущем ходу. Повторять чужие ходы и свои более старые ходы разрешается". Ничего не получилось(((
Здравствуйте Алексей. Используя ваш код у меня почему-то не получается верно решать именно 19 номера. Например обычная задача с одной кучей: Ходы(+1, +4, *5), Победа(>=68). Правильный ответ 3, а программа выводит 13. При этом для 20 и 21 номера ответы верны. Подскажите пожалуйста, в чем может быть проблема?
Столкнулся с такой же проблемой, но нашел решение: вместо "return any(g) if (h-1)%2==0 else all(g)" нужно вписать "return any(g) if (h-1)%2==0 else any(g)" тогда правильным ответом будет первый из выведенного списка.
@@prostodude2320 так это не в решении проблема, пролистай каждое задание в видосе, там есть задание с условием что первый ход неудачный и при таком условии мы заменяем all на any, а для 20,21 обратно меняем any на all