мужик, спасибо тебе большое, у меня завтра пересдача, я посмотрел у тебя всего 2 видео с заданием 8 и теорией игр, но я тебе безумно благодарен, никто не может так кратко и быстро объяснить задание как ты.+rep
А что делать, если игрок не может повторять свой собственный последний ход? Из РЕШУ ЕГЭ под номерами 46977, 46978, 46979 Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом нельзя повторять ход, который этот же игрок делал на предыдущем ходу. Повторять чужие ходы и свои более старые ходы разрешается. Например, если в начале игры в куче 3 камня, Петя может первым ходом получить кучу из 4, 5 или 6 камней. Если Петя получил кучу из 5 камней (добавил два камня), то следующим ходом Ваня может получить 6, 7 или 10 камней. Если Ваня добавил один камень и получил 6 камней, то вторым ходом Петя может получить 7 или 12 камней. Получить 8 камней Петя не может, так как для этого нужно добавить 2 камня, а Петя делал это на предыдущем ходу. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается, когда количество камней в куче становится не менее 21. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 21 или больше камней. В начальный момент в куче было S камней, 1 ⩽ S ⩽ 20. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. 19. Укажите наименьшее значение S, при котором Петя не может выиграть за один ход, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом. 20. Укажите два значения S, при которых у Вани есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом. В ответе запишите найденные значения в порядке возрастания: сначала меньшее, затем большее. 21. Найдите наибольшее значение S, при котором у Пети есть выигрышная стратегия, позволяющая ему выиграть третьим ходом при любой игре Вани, но у Пети нет стратегии, которая позволяла бы ему гарантированно выиграть первым или вторым ходом. В общем, я изменил move(h) следующим образом: def move(h): a = [] x, my_last, his_last = h if my_last != '+1': a.append((x + 1, '+1', my_last)) if my_last != '+2': a.append((x + 2, '+2', my_last)) if my_last != '*2': a.append((x * 2, '*2', my_last)) return a но ответы с таким вариантом программы не совпадают, и кажется, что я просто забываю использовать his_last. UPD: Я попробовал написать две разные функции move(h) для Пети и Вани по образцу из видео, и это приводит меня к тем же самым неправильным ответам. UPD 2: Вот правильная функция: def move(h): x, his_last, my_last = h a = [] if my_last != '+1': a.append((x + 1, '+1', his_last)) if my_last != '+2': a.append((x + 2, '+2', his_last)) if my_last != '*2': a.append((x * 2, '*2', his_last)) return a
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся на 1 камень меньше, чем убирается). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не более 20. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 20 или меньше камней. В начальный момент в первой куче было 10 камней, во второй куче - S камней, S > 10. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите максимальное значение S, когда такая ситуация возможна.
Спасибо! Готовился к ЕГЭ по информатике в 10 классе по курсу Flash из 100бальногорепетитора, а летом доступ к нему блокируется... Ты очень помог мне вспомнить :) В школьное время было лень разбираться в рекурсиях и я упустил суть решения Python. Вот, сижу летом готовлюсь...
Большое спасибо за разбор, стало намного проще и в целом понятней, как решать такие задачи, но вот у меня попалась такая вариация задачи, когда не "нельзя повторять ход, который сделал второй игрок", а "нельзя повторять ход, который этот же игрок делал на предыдущем ходу". Всё пытался догадаться, как изменить код в таком случае, но так и не додумался. Сможете, пожалуйста, помочь?
я не понимаю суть функции game, как она работает. Если какой нибудь первый ход окажется выигрышным то выходит P1. А если все ходы выводят P1 то возвращается В1, это не понятно, почему при всех ходах когда петя выигрывает 1ым ходом у вани выигрышный? кажется я запутался, я чтото не так понял
Удобнее для понимания нарисовать дерево ходов, а я пока что объясню на словах: Петя по условию ходит всегда первый, значит если у него есть ХОТЯ БЫ ОДИН ход приводящий его к победе - то он и победит. Но такая конструкция не работает для Вани - ведь он ходит после Пети - поэтому чтобы доказать что выигрывает Ваня необходимо рассмотреть ВСЕ ходы Пети и при каждом доказать что Ваня побеждает. Что же касается P1 - это выигрышная стратегия - то есть та из которой можно выиграть и раз Все ходы ведут в такие позиции - значит из всех них будет побеждать мой оппонент - а значит я сам нахожусь в проигрышной
Там, кстати, в последней задаче в 21 номере можно было написать: If sum(game(m) == «В1» for m in move(h)) == 2: return P2 Ответ будет правильный В отличии от any, который ищет единственный True, sum может посчитать количество True(тк в питоне True приравнивается к единице)
Помогите, прошу!!! Я просто не понимаю, моя программа в точности, как на видео, но она выводит только сообщение об ошибке максимума рекурсии. Условия: 1
Ответить на 21-й вопрос последней задачи можно так: for s in range(1, 41): if game(s) == 'p2' and ((game(s*2) == 'v1') + (game(s+1) == 'v1') + (game(s+2) == 'v1')) == 2: print(s)
Как нужно изменить код, если в условии написано, что нельзя повторять прошлый ход этого же игрока. Вот условие: Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом нельзя повторять ход, который этот же игрок делал на предыдущем ходу. Повторять чужие ходы и свои более старые ходы разрешается. Например, если в начале игры в куче 3 камня, Петя может первым ходом получить кучу из 4, 5 или 6 камней. Если Петя получил кучу из 5 камней (добавил два камня), то следующим ходом Ваня может получить 6, 7 или 10 камней. Если Ваня добавил один камень и получил 6 камней, то вторым ходом Петя может получить 7 или 12 камней. Получить 8 камней Петя не может, так как для этого нужно добавить 2 камня, а Петя делал это на предыдущем ходу. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается, когда количество камней в куче становится не менее 29. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней. В начальный момент в куче было S камней, 1 ⩽ S ⩽ 28. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Укажите наименьшее значение S, при котором Петя не может выиграть за один ход, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом.
Как вариант, первое что приходит на ум это завести кортеж ходов, но сделаем его максимальной длины 2, то есть после своего хода будем добавлять туда ход, и убирать нулевой элемент, а проверять будем именно нулевой элемент, то есть предпредыдущий, соответственно наш. Изначальное значение поставим за (0, 0). Изначально начал делать с массивом, но столкнулся с ошибкой хеширования, так и не понял с чем связано, но в итоге перешел на кортеж. Вот пример кода: from functools import lru_cache def moves(h): x, steps = h a = [] if steps[0] != '+1': steps = (steps[1], '+1') a.append((x + 1, steps)) if steps[0] != '+2': steps = (steps[1], '+2') a.append((x + 2, steps)) if steps[0] != '*2': steps = (steps[1], '*2') a.append((x * 2, steps)) return a @lru_cache(None) def game(h): x, steps = h if x >= 29: return 'W' if any(game(m) == 'W' for m in moves(h)): return 'P1' if all(game(m) == 'P1' for m in moves(h)): return 'B1' if any(game(m) == 'B1' for m in moves(h)): return 'P2' if all(game(m) == 'P1' or game(m) == 'P2' for m in moves(h)): return 'B2' for s in range(1, 28): h = (s, (0, 0)) if game(h) == 'P2': print(s, game(h)) Такой код выдает: 7 P2 11 P2 12 P2 13 P2 То есть минимальный s = 7
@@end2395 Спасибо за идею, помог, но хочу подметить, что вместо "steps" в условии лучше использовать новую переменную, а то последний ход перемешивается и ответ на 46977 получается не правильным (но я решил).
Не понимаю почему не выдает ответ программа задача:Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в три раза. Например, пусть в одной куче 5 камней, а в другой 9 камней; такую позицию мы будем обозначать (5, 9). За один ход из позиции (5, 9) можно получить любую из четырёх позиций: (6, 9), (15, 9), (5, 10), (5, 27). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 79. Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет 79 или больше камней. В начальный момент в первой куче было 6 камней, во второй куче - S камней; 1 ≤ S ≤ 72. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника. Найдите максимальное значение S, при котором у Вани есть выигрышная стратегия, позволяющая ему выиграть при любой игре Пети. код: from functools import lru_cache def moves(h): a, b = h return (a + 1, b), (a * 3, b), (a, b + 1), (a, b * 3) @lru_cache(None) def game(h): a, b = h if a+b >= 79: return 'W' if any(game(m) == 'W' for m in moves(h)): return 'P1' if all(game(m) == 'P1' for m in moves(h)): return 'B1' if any(game(m) == 'B1' for m in moves(h)): return 'P2' if all(game(m) == 'P1' or game(m) == 'P2' for m in moves(h)): return 'B2' for s in range(1, 200): h = 6, s if game(h) == 'B2': print(s, game(h))
Так а может тебе здесь B1 нужно найти на не B2? Может четко написать номер задания ( 19 20 или 21) и что нужно найти дословно Потому что код написан верно
Попалось задание на решу егэ с одной кучей и возможные ходы - добавить 1 камень или увеличить в 6 раз их количество. Победа получается, когда камней больше 361 Если для s брать начальное значение меньше 112 то прога ошибку выдает, а если брать значения выше - ответа просто нет Номер на решу егэ: 28142 Условие: Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в шесть раз. Например, имея кучу из 10 камней, за один ход можно получить кучу из 11 или 60 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче превышает 361. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 362 или больше камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 360. Говорят, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Подскажите пожалуйста, почему в начале условие any? Ведь нам нужно выгнать при любом ходе Пети. Разве это не all? 10 раз пересмотрела, все равно не понимаю
Подскажите пожалуйста как решить эту задачу способом из видео но так чтобы она не выходила за предел рекурсии Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или возвести количество камней в квадрат. Например, имея кучу из 7 камней, за один ход можно получить кучу из 8 или 49 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится 100 или более. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 100 или больше камней. В начальный момент в куче было S камней, 1 < S < 99. Говорят, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
помогите пожалуйста, я решаю вашим способом, в целом всё ок, я всё понимаю, но попалась задача с условием "так же за всю игру можно только один раз сделать суперход - ход, после которого количество камней в куче не изменится, а очередь хода перейдёт к сопернику, т.е. суперход может сделать один раз либо Ваня, либо Петя". я не понимаю, как это прописать в коде
Отличное видео, но у меня до сих пор остался вопрос по #6 из 9-10 варианта, проблема заключается в следующем: черепаха поначалу стоит на одном месте, а затем рисует фигуру. Вот условия из 9 варианта (Направо 30 [Вперёд 30 Направо 60 Вперёд 30 Направо 120] и условие из 10 варианта: (Повтори 10 [Направо 120 Вперёд 12 Направо 60 Вперёд 12] Код для 10 варианта: from turtle import * color('black', 'red') m = 100 begin_fill() left(90) for i in range(4): right(120) forward(12*m) right(60) forward(12*m) end_fill() canvas = getcanvas() cnt = 0 for x in range(-130*m, 130*m, m): for y in range(-130*m, 130*m, m): item = canvas.find_overlapping(x,y,x,y) if len(item) == 1 and item[0] == 5: cnt += 1 print(cnt) done() ext() Код для 9 варианта: from turtle import * color('black' 'red') m = 100 begin_fill() right(30) left(60) for i in range(4): forward(30*m) right(60) forward(30*m) right(120) end_fill() canvas = getcanvas() cnt = 0 for x in range(-130*m, 130*m, m): for y in range(-130*m, 130*m, m): item = canvas.find_overlapping(x,y,x,y) if len(item) == 1 and item[0] == 5: cnt += 1 print(cnt) done() ext()
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся на 1 камень больше, чем убирается). Например, пусть в одной куче 6, а в другой 9 камней; такую позицию мы будем обозначать (6, 9). За один ход из позиции (6, 9) можно получить любую из четырёх позиций: (5, 9), (3, 9), (6, 8), (6, 5). Игра завершается в тот момент, когда суммарное количество камней в кучах становится не более 40. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 40 или меньше камней. В начальный момент в первой куче было 20 камней, во второй куче - S камней, S > 20. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, т.е не гарантирующие выигрыш независимо от игры противника. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите максимальное значение S, когда такая ситуация возможна.
@@inf99ballov Известно, что Петя проиграл своим вторым ходом после неудачного хода Вани. Такое может быть? И еще одна формулировка:Известно, что Петя выиграл своим вторым ходом после неудачного хода Вани
@@inf99ballov по условию s > 20. но в коде в цикле for ты перебираешь от 20 включительно. я проверил: на ответ это не повлияло, но исправь всё же, пожалуйста
В чем разница между вашим методом и "традиционным" методом через итерацию? def f(s1,s2,p): if s1+s2 >= ... and p == ...: return True; if s1+s2 = ... : return False; if ... : return f(s1*2,s2,p+1) or (and) ... ... for s2 in range(100): if f(...,s2,1): print(s2);
@@rebellion255 ну может он для тебя и стандартный, на самом деле решай так как тебе удобно, только попробуй решить все задачи из видео через свой код - если получится без проблем, то юзай его раз он тебе понятней
@@inf99ballovПросто на курсы по подготовке к ЕГЭ хожу, теорию игр по твоим шаблонам делаю, сегодня даже учителю это шаблон показывал. Также большое тебе спасибо за всё то, что ты делаешь для нас, твои видео очень помогают. Ну а вот такую задачу я не сделал. Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем обозначать (10, 5). Тогда за один ход можно получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней. В начальный момент в первой куче было семь камней, во второй куче - S камней; 1 ≤ S ≤ 69. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника. Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна. Вот "не следует", как мне кажется, там для неё команду "else" может использовать нужно?
@@АртёмМорозов-б7э Так это же самая обычная задача на две кучи камней. Тебя смущает формулировка: Неудачного хода Пети? Я решал такую задачу в видео, погляди внимательнее(3 по счету вроде))) там нужно просто в одном моменте all ан any поменять и все
@@АртёмМорозов-б7э А вот этот кусок: """ Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника. """ Вообще рудимент, который остался с егэ 2020 годов, когда выигрышные стратегии расписывали руками - на него вообще забей)
вчера на решу егэ мне попались задачи на теорию игр под номером 28236 по 28238 включительно, где в условиях можно к куче прибавить один камень или возвести в квадрат. скажите, пожалуйста, как правильно отразить это условие в коде?
Разве в первой задаче ответ не 7? Петя выбирает h*2 и получает 14 камней, потом Ваня выбирает h*2 и получает 28 камней >=25, то есть выигрывает. Или я что-то не понимаю?
У меня задача аналогична первой, но всего лишь отличаются ходы и количество камней в куче, требуемое для выигрыша, код для задачи из видео работает, но для моей выдает макс глубину рекурсии... Изменено: проблема в том , что второй ход сначала умножает на 4, а затем вычитает из кучи 3 камня, но я все равно не пойму где рекурсия не может остановиться...
@@inf99ballov я пробовал его на двух разных задачах и в обоих случаях он выдавал слишком большое число (19 задача), а при слишком маленьком значении (собственно говоря, правильном ответе) в результате было None. Из-за чего это может быть?
@@alextarr430 Ошибка могла быть где угодно, может быть ты all на any не менял потому что как правило в 19 задачи нужен неудачных ход пети. Но ответить точно смогу только если взгляну на пример
@@kubsupreme1629 потому что как только в задаче действий которые можно сделать становится больше двух, и ты пишешь это в код, программа уже не выдает ответа
@@hedamn6416 У меня такая же проблема возникла, потому что я в цикле писал только конечное число, типа for s in range(36): А надо от единицы до конечного: for s in range(1,36): У меня проблема решилась, надеюсь поможет
Для задания 46977 (одна куча, три хода, запоминание хода(одного и того же игрока)): from functools import lru_cache def m(s): A = [] x,steps = s if steps[0] != '+1': q = (steps[1],'+1') A.append((x + 1,q)) if steps[0] != '+2': q = (steps[1],'+2') A.append((x + 2,q)) if steps[0] != '*2': q = (steps[1],'*2') A.append((x * 2,q)) return A @lru_cache(None) def g(s): x, steps = s if x >= 21: return 'w' if any(g(x) == 'w' for x in m(s)): return 'p1' if all(g(x) == 'p1' for x in m(s)): return 'w1' if any(g(x) == 'w1' for x in m(s)): return 'p2' if all(g(x) == 'p1' or g(x) == 'p2' for x in m(s)): return 'w2' if any(g(x) == 'w1' or g(x) == 'w2' for x in m(s)): return 'p3' if all(g(x) == 'p1' or g(x) == 'p2' or g(x) == 'p3' for x in m(s)): return 'w3' for s in range(1,21): h = (s,(0,0)) if g(h) == 'p2': print(s) Не уверен в правильности хода Вани(3), но в целом код рабочий!
вы прекрасны, я счастлив, что теперь понимаю теорию игр, и всё благодаря вам!!!! Спасибо
мужик, спасибо тебе большое, у меня завтра пересдача, я посмотрел у тебя всего 2 видео с заданием 8 и теорией игр, но я тебе безумно благодарен, никто не может так кратко и быстро объяснить задание как ты.+rep
сколько баллов написал?
большое спасибо, смотрела много разборов, и только сейчас поняла
Спасибо большое! Очень рад тому, что нашёл гибкий способ для ТИ. Целую недели искал и не мог найти))
Спасибо большое! Документ Полякова на 60 страниц никак не сравнится по эффективности с твоим 50-и минутным роликом! Всё чётко и понятно
невероятно помогло, большое спасибо!
А что делать, если игрок не может повторять свой собственный последний ход? Из РЕШУ ЕГЭ под номерами 46977, 46978, 46979
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом нельзя повторять ход, который этот же игрок делал на предыдущем ходу. Повторять чужие ходы и свои более старые ходы разрешается.
Например, если в начале игры в куче 3 камня, Петя может первым ходом получить кучу из 4, 5 или 6 камней. Если Петя получил кучу из 5 камней (добавил два камня), то следующим ходом Ваня может получить 6, 7 или 10 камней. Если Ваня добавил один камень и получил 6 камней, то вторым ходом Петя может получить 7 или 12 камней. Получить 8 камней Петя не может, так как для этого нужно добавить 2 камня, а Петя делал это на предыдущем ходу.
Чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается, когда количество камней в куче становится не менее 21. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 21 или больше камней. В начальный момент в куче было S камней, 1 ⩽ S ⩽ 20.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
19. Укажите наименьшее значение S, при котором Петя не может выиграть за один ход, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом.
20. Укажите два значения S, при которых у Вани есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом.
В ответе запишите найденные значения в порядке возрастания: сначала меньшее, затем большее.
21. Найдите наибольшее значение S, при котором у Пети есть выигрышная стратегия, позволяющая ему выиграть третьим ходом при любой игре Вани, но у Пети нет стратегии, которая позволяла бы ему гарантированно выиграть первым или вторым ходом.
В общем, я изменил move(h) следующим образом:
def move(h):
a = []
x, my_last, his_last = h
if my_last != '+1': a.append((x + 1, '+1', my_last))
if my_last != '+2': a.append((x + 2, '+2', my_last))
if my_last != '*2': a.append((x * 2, '*2', my_last))
return a
но ответы с таким вариантом программы не совпадают, и кажется, что я просто забываю использовать his_last.
UPD:
Я попробовал написать две разные функции move(h) для Пети и Вани по образцу из видео, и это приводит меня к тем же самым неправильным ответам.
UPD 2:
Вот правильная функция:
def move(h):
x, his_last, my_last = h
a = []
if my_last != '+1':
a.append((x + 1, '+1', his_last))
if my_last != '+2':
a.append((x + 2, '+2', his_last))
if my_last != '*2':
a.append((x * 2, '*2', his_last))
return a
Почаще делай видео, быстрее и познавательнее смотреть, чем вебинары
😐😐😐
Лайк. Репост. Спасибо. Очень недурно
Рад стараться
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся на 1 камень меньше, чем убирается).
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не более 20. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 20 или меньше камней.
В начальный момент в первой куче было 10 камней, во второй куче - S камней, S > 10.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите максимальное значение S, когда такая ситуация возможна.
Спасибо за 3 балла на егэ ❤
Спасибо! Готовился к ЕГЭ по информатике в 10 классе по курсу Flash из 100бальногорепетитора, а летом доступ к нему блокируется... Ты очень помог мне вспомнить :) В школьное время было лень разбираться в рекурсиях и я упустил суть решения Python. Вот, сижу летом готовлюсь...
Большое спасибо за разбор, стало намного проще и в целом понятней, как решать такие задачи, но вот у меня попалась такая вариация задачи, когда не "нельзя повторять ход, который сделал второй игрок", а "нельзя повторять ход, который этот же игрок делал на предыдущем ходу". Всё пытался догадаться, как изменить код в таком случае, но так и не додумался. Сможете, пожалуйста, помочь?
Догадался?
@@sjjdbsjziizjsbqjqbrbx, Неа, так и не вышло
я не понимаю суть функции game, как она работает. Если какой нибудь первый ход окажется выигрышным то выходит P1. А если все ходы выводят P1 то возвращается В1, это не понятно, почему при всех ходах когда петя выигрывает 1ым ходом у вани выигрышный? кажется я запутался, я чтото не так понял
Удобнее для понимания нарисовать дерево ходов, а я пока что объясню на словах: Петя по условию ходит всегда первый, значит если у него есть ХОТЯ БЫ ОДИН ход приводящий его к победе - то он и победит. Но такая конструкция не работает для Вани - ведь он ходит после Пети - поэтому чтобы доказать что выигрывает Ваня необходимо рассмотреть ВСЕ ходы Пети и при каждом доказать что Ваня побеждает. Что же касается P1 - это выигрышная стратегия - то есть та из которой можно выиграть и раз Все ходы ведут в такие позиции - значит из всех них будет побеждать мой оппонент - а значит я сам нахожусь в проигрышной
Просто мощь. Отлично снято, качество, звук, атмосфера, подача - подход к своей работе на высоте! Целеустремленность твоё второе имя. Дальше лучше.
Там, кстати, в последней задаче в 21 номере можно было написать:
If sum(game(m) == «В1» for m in move(h)) == 2: return P2
Ответ будет правильный
В отличии от any, который ищет единственный True, sum может посчитать количество True(тк в питоне True приравнивается к единице)
Помогите, прошу!!!
Я просто не понимаю, моя программа в точности, как на видео, но она выводит только сообщение об ошибке максимума рекурсии.
Условия: 1
лучшииий, очень круто объяснил, еще и через прогу!!
Ответить на 21-й вопрос последней задачи можно так:
for s in range(1, 41):
if game(s) == 'p2' and ((game(s*2) == 'v1') + (game(s+1) == 'v1') + (game(s+2) == 'v1')) == 2:
print(s)
душевно благодарен, добавлю такое решение в документ)
как на 3 кучи делать?
Как нужно изменить код, если в условии написано, что нельзя повторять прошлый ход этого же игрока. Вот условие:
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом нельзя повторять ход, который этот же игрок делал на предыдущем ходу. Повторять чужие ходы и свои более старые ходы разрешается.
Например, если в начале игры в куче 3 камня, Петя может первым ходом получить кучу из 4, 5 или 6 камней. Если Петя получил кучу из 5 камней (добавил два камня), то следующим ходом Ваня может получить 6, 7 или 10 камней. Если Ваня добавил один камень и получил 6 камней, то вторым ходом Петя может получить 7 или 12 камней. Получить 8 камней Петя не может, так как для этого нужно добавить 2 камня, а Петя делал это на предыдущем ходу.
Чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается, когда количество камней в куче становится не менее 29. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней. В начальный момент в куче было S камней, 1 ⩽ S ⩽ 28.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите наименьшее значение S, при котором Петя не может выиграть за один ход, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом.
Как вариант, первое что приходит на ум это завести кортеж ходов, но сделаем его максимальной длины 2, то есть после своего хода будем добавлять туда ход, и убирать нулевой элемент, а проверять будем именно нулевой элемент, то есть предпредыдущий, соответственно наш. Изначальное значение поставим за (0, 0). Изначально начал делать с массивом, но столкнулся с ошибкой хеширования, так и не понял с чем связано, но в итоге перешел на кортеж. Вот пример кода:
from functools import lru_cache
def moves(h):
x, steps = h
a = []
if steps[0] != '+1':
steps = (steps[1], '+1')
a.append((x + 1, steps))
if steps[0] != '+2':
steps = (steps[1], '+2')
a.append((x + 2, steps))
if steps[0] != '*2':
steps = (steps[1], '*2')
a.append((x * 2, steps))
return a
@lru_cache(None)
def game(h):
x, steps = h
if x >= 29: return 'W'
if any(game(m) == 'W' for m in moves(h)): return 'P1'
if all(game(m) == 'P1' for m in moves(h)): return 'B1'
if any(game(m) == 'B1' for m in moves(h)): return 'P2'
if all(game(m) == 'P1' or game(m) == 'P2' for m in moves(h)): return 'B2'
for s in range(1, 28):
h = (s, (0, 0))
if game(h) == 'P2':
print(s, game(h))
Такой код выдает:
7 P2
11 P2
12 P2
13 P2
То есть минимальный s = 7
@@end2395 Спасибо за идею, помог, но хочу подметить, что вместо "steps" в условии лучше использовать новую переменную, а то последний ход перемешивается и ответ на 46977 получается не правильным (но я решил).
В заданиях с двумя кучами пишет что a не определено. и ошибку выдает в строке a,b=h. Что делать??
вот есть будет другая задача на ЕГЭ, как перекрутить у себя всю эту логику в голове? это же не реально
Есть же, если ты не пень же, получиться же. А иначе же нафиг ты такой в унике нужен
Так а что сложного? Код немного меняешь и все либо руками
если попадется новая задача, то, скорее всего, она будет не сложной, но будет усложняться в следующих годах
Не понимаю почему не выдает ответ программа
задача:Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в три раза. Например, пусть в одной куче 5 камней, а в другой 9 камней; такую позицию мы будем обозначать (5, 9). За один ход из позиции (5, 9) можно получить любую из четырёх позиций: (6, 9), (15, 9), (5, 10), (5, 27).
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 79. Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет 79 или больше камней.
В начальный момент в первой куче было 6 камней, во второй куче - S камней; 1 ≤ S ≤ 72.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т. е. не являющиеся выигрышными независимо от игры противника.
Найдите максимальное значение S, при котором у Вани есть выигрышная стратегия, позволяющая ему выиграть при любой игре Пети.
код:
from functools import lru_cache
def moves(h):
a, b = h
return (a + 1, b), (a * 3, b), (a, b + 1), (a, b * 3)
@lru_cache(None)
def game(h):
a, b = h
if a+b >= 79: return 'W'
if any(game(m) == 'W' for m in moves(h)): return 'P1'
if all(game(m) == 'P1' for m in moves(h)): return 'B1'
if any(game(m) == 'B1' for m in moves(h)): return 'P2'
if all(game(m) == 'P1' or game(m) == 'P2' for m in moves(h)): return 'B2'
for s in range(1, 200):
h = 6, s
if game(h) == 'B2':
print(s, game(h))
Так а может тебе здесь B1 нужно найти на не B2? Может четко написать номер задания ( 19 20 или 21) и что нужно найти дословно
Потому что код написан верно
Попалось задание на решу егэ с одной кучей и возможные ходы - добавить 1 камень или увеличить в 6 раз их количество.
Победа получается, когда камней больше 361
Если для s брать начальное значение меньше 112 то прога ошибку выдает, а если брать значения выше - ответа просто нет
Номер на решу егэ: 28142
Условие:
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в шесть раз. Например, имея кучу из 10 камней, за один ход можно получить кучу из 11 или 60 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче превышает 361. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 362 или больше камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 360.
Говорят, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Нашел решение
Нужно добавить:
from sys import setrecursionlimit
setrecursionlimit(2000)
Подскажите пожалуйста, почему в начале условие any? Ведь нам нужно выгнать при любом ходе Пети. Разве это не all? 10 раз пересмотрела, все равно не понимаю
Привет, просто интересно)) Сколько в месяц зарабатываешь на репетиторстве? Больше 150к?
Просто отдуши, я всё понял, ты лучший
а что делать если на код с 2 кучами выдает, что "a, b = h TypeError: cannot unpack non-iterable int object"
ошибка в шаблоне, скорее всего забыла в основном цикле под функцией передавать h как 2 числа, поэтому и распаковать обратно он не может
Подскажите пожалуйста как решить эту задачу способом из видео но так чтобы она не выходила за предел рекурсии Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или возвести количество камней в квадрат. Например, имея кучу из 7 камней, за один ход можно получить кучу из 8 или 49 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится 100 или более. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 100 или больше камней.
В начальный момент в куче было S камней, 1 < S < 99.
Говорят, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
спасибо большое!!!
Люблю когда не надо думать, спасибо😘
помогите пожалуйста, я решаю вашим способом, в целом всё ок, я всё понимаю, но попалась задача с условием "так же за всю игру можно только один раз сделать суперход - ход, после которого количество камней в куче не изменится, а очередь хода перейдёт к сопернику, т.е. суперход может сделать один раз либо Ваня, либо Петя". я не понимаю, как это прописать в коде
а почему при более больших числах (200+) в стандартных задачах на одну кучу ничего не работает и можно ли это как-то решить ?
Начинай перебор с больших чисел. Например у тебя победа с 350, тогда начни с 100
достаточно добавить
from sys import setrecursionlimit
setrecursionlimit(2000)
Отличное видео, но у меня до сих пор остался вопрос по #6 из 9-10 варианта, проблема заключается в следующем: черепаха поначалу стоит на одном месте, а затем рисует фигуру. Вот условия из 9 варианта (Направо 30 [Вперёд 30 Направо 60 Вперёд 30 Направо 120] и условие из 10 варианта: (Повтори 10 [Направо 120 Вперёд 12 Направо 60 Вперёд 12]
Код для 10 варианта:
from turtle import *
color('black', 'red')
m = 100
begin_fill()
left(90)
for i in range(4):
right(120)
forward(12*m)
right(60)
forward(12*m)
end_fill()
canvas = getcanvas()
cnt = 0
for x in range(-130*m, 130*m, m):
for y in range(-130*m, 130*m, m):
item = canvas.find_overlapping(x,y,x,y)
if len(item) == 1 and item[0] == 5:
cnt += 1
print(cnt)
done()
ext()
Код для 9 варианта:
from turtle import *
color('black' 'red')
m = 100
begin_fill()
right(30)
left(60)
for i in range(4):
forward(30*m)
right(60)
forward(30*m)
right(120)
end_fill()
canvas = getcanvas()
cnt = 0
for x in range(-130*m, 130*m, m):
for y in range(-130*m, 130*m, m):
item = canvas.find_overlapping(x,y,x,y)
if len(item) == 1 and item[0] == 5:
cnt += 1
print(cnt)
done()
ext()
Них у тебя код
Ты ещё на ассемблере черепашку пропиши
кумир в помощь
@@matikkyt3710 👌
день до егэ) хыхыхы
Ну лучший. Прям спас.
Можете помочь, у меня достигается максимум рекурсии, хотя кэширование я сделал. Что делать в таком случае?
👍 СЮДАААААА
{под видео}
🦆
Я немного не понял насчет "if h>60: return 'P1'" разве не B1 должно быть? если именно оппонент выигрывает или P2 а не P1?
Если кто нибудь понял может пояснить поподробнее?
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся на 1 камень больше, чем убирается). Например, пусть в одной куче 6, а в другой 9 камней; такую позицию мы будем обозначать (6, 9). За один ход из позиции (6, 9) можно получить любую из четырёх позиций: (5, 9), (3, 9), (6, 8), (6, 5).
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не более 40. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 40 или меньше камней.
В начальный момент в первой куче было 20 камней, во второй куче - S камней, S > 20.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит, описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по ней игрока, которые не являются для него безусловно выигрышными, т.е не гарантирующие выигрыш независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите максимальное значение S, когда такая ситуация возможна.
Решил
чекай гугл документ
@@inf99ballov Известно, что Петя проиграл своим вторым ходом после неудачного хода Вани. Такое может быть?
И еще одна формулировка:Известно, что Петя выиграл своим вторым ходом после неудачного хода Вани
@@inf99ballov по условию s > 20. но в коде в цикле for ты перебираешь от 20 включительно. я проверил: на ответ это не повлияло, но исправь всё же, пожалуйста
13.35 что нужно прописать, чтобы не учитывать ходы которые ведут в значение больше 60?
В чем разница между вашим методом и "традиционным" методом через итерацию?
def f(s1,s2,p):
if s1+s2 >= ... and p == ...: return True;
if s1+s2 = ... : return False;
if ... : return f(s1*2,s2,p+1) or (and) ...
...
for s2 in range(100):
if f(...,s2,1):
print(s2);
нравится в говне наверн повозиться им)
@@GhostKarin кому именно? тем, у кого код больше?
@@rebellion255 да, в котором легко запутаться
@@GhostKarin надеюсь, мне скажут, зачем этот длинный код нужен и чем он отличается от стандартного
@@rebellion255 ну может он для тебя и стандартный, на самом деле решай так как тебе удобно, только попробуй решить все задачи из видео через свой код - если получится без проблем, то юзай его раз он тебе понятней
А можешь, пожалуйста, разобрать задачи по теории игр, когда в условии написано "не следует"
Скинь пожалуйста такое условие, что-то я таких не припомню
@@inf99ballovПросто на курсы по подготовке к ЕГЭ хожу, теорию игр по твоим шаблонам делаю, сегодня даже учителю это шаблон показывал. Также большое тебе спасибо за всё то, что ты делаешь для нас, твои видео очень помогают. Ну а вот такую задачу я не сделал. Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем обозначать (10, 5). Тогда за один ход можно получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 77. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 77 или больше камней.
В начальный момент в первой куче было семь камней, во второй куче - S камней; 1 ≤ S ≤ 69.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Вот "не следует", как мне кажется, там для неё команду "else" может использовать нужно?
@@АртёмМорозов-б7э Так это же самая обычная задача на две кучи камней. Тебя смущает формулировка: Неудачного хода Пети? Я решал такую задачу в видео, погляди внимательнее(3 по счету вроде))) там нужно просто в одном моменте all ан any поменять и все
@@АртёмМорозов-б7э А вот этот кусок:
"""
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.
"""
Вообще рудимент, который остался с егэ 2020 годов, когда выигрышные стратегии расписывали руками - на него вообще забей)
@@inf99ballov понял, спасибо большое, что объяснил)
при поиске максимального S выдает на единицу меньше ответа. Можете подсказать?
а что делать коогда в условии на две кучи камней в обоих неизвестное значение?
P1 и B1 очень путают понимание рекурсии, надо было по другому обозвать
вчера на решу егэ мне попались задачи на теорию игр под номером 28236 по 28238 включительно, где в условиях можно к куче прибавить один камень или возвести в квадрат.
скажите, пожалуйста, как правильно отразить это условие в коде?
def moves(h):
return h+1, h**2
@@black_inside я так и написал, но у меня выдаёт ошибку
@@divine3728 выдаёт ошибку, т.к. ты бесконечно возводишь 1 в квадрат, поэтому начни перебор с 2
А все прототипы можно ли решить через эксель? Скажите, пожалуйста
Ну скорее всего можно, но в некоторых случаях очень "неприятно"
Кто знает как решить ошибку: cannot unpack non-iterable int object. Она возникает только тогда , когда в задаче 2 кучи .
скинь свою прогу, я скажу где ошибка
@@inf99ballov спасибо ,но я уже разобрался) В конце , условие нужно было из game(s) сделать game(h)
код абсолютно не работает на некоторых задачах.
На каких типах не работает например?
Разве в первой задаче ответ не 7? Петя выбирает h*2 и получает 14 камней, потом Ваня выбирает h*2 и получает 28 камней >=25, то есть выигрывает. Или я что-то не понимаю?
В задаче написано при ЛЮБОЙ ИГРЕ ПЕТИ а значит что ваня должен выиграть при обоих его ходах а не только при умножении на два
сколько баллов дает эти 3 задания в сумме??
3
На ЕГЭ могут попасться только камни или ещё что-то?
может быть что угодно, но из года в год только камни дают или что-то на них похожее
а теория игр только на камни существует?
Почему в задаче на две кучи 19 номер не считает? (не выдает никакой ответ,
какие 3 месяца. осталось 13 часов😋
понимаю
Так и не понял, что такое P1, P2, B1, B2?
У меня задача аналогична первой, но всего лишь отличаются ходы и количество камней в куче, требуемое для выигрыша, код для задачи из видео работает, но для моей выдает макс глубину рекурсии...
Изменено: проблема в том , что второй ход сначала умножает на 4, а затем вычитает из кучи 3 камня, но я все равно не пойму где рекурсия не может остановиться...
итак, проблему решил тем, что начал перебирать цикл не с 1, а с 2(просто другие решения данной проблемы выдают ошибку)
метод алексея кабанова короче и красивей будет
Согласен, на мой взгляд, этот просто по-понятнее, ну а вы выбирайте сами)
код перестает работать при большом количестве камней
import sys
sys.setrecursionlimit(2500) # увеличивай значение, пока ошибка не пропадет
это исправит проблему с глубиной рекурсии
А как же фишки?
имба
голос на пятёрку похож)
🦆
код некорректно работает при других числах
Код как раз работает корректно, возможно ты просто ошибся, скинь задачу и свое решение я посмотрю
@@inf99ballov я пробовал его на двух разных задачах и в обоих случаях он выдавал слишком большое число (19 задача), а при слишком маленьком значении (собственно говоря, правильном ответе) в результате было None.
Из-за чего это может быть?
@@alextarr430 Ошибка могла быть где угодно, может быть ты all на any не менял потому что как правило в 19 задачи нужен неудачных ход пети. Но ответить точно смогу только если взгляну на пример
@@inf99ballov мои комментарии с задачей и кодом почему-то удаляются сами по себе после отправления(( Могу я скинуть на почту или еще куда-то?
@@alextarr430 по ссылке в описании есть телеграм канал, можешь в комменты просто скинь куда-нибудь под постом
код не рабочий )
Всмысле?
Почему?
@@kubsupreme1629 потому что как только в задаче действий которые можно сделать становится больше двух, и ты пишешь это в код, программа уже не выдает ответа
@@hedamn6416 У меня такая же проблема возникла, потому что я в цикле писал только конечное число, типа
for s in range(36):
А надо от единицы до конечного:
for s in range(1,36):
У меня проблема решилась, надеюсь поможет
я ору чаечкой с названий файлов
😂ты на того типа из волчонка похож
спасибо за ребенка
огромное спасибо
Теория подставы...
Программа работает не так, как на видео. Она неправильная
как же она тогда выдает правильные ответы?
А как все это запомнить ахаха
практика и практика))
Не тратьте время, иван викторович объяснил всё проще и за 8 минут, а не за час.
Для задания 46977 (одна куча, три хода, запоминание хода(одного и того же игрока)):
from functools import lru_cache
def m(s):
A = []
x,steps = s
if steps[0] != '+1':
q = (steps[1],'+1')
A.append((x + 1,q))
if steps[0] != '+2':
q = (steps[1],'+2')
A.append((x + 2,q))
if steps[0] != '*2':
q = (steps[1],'*2')
A.append((x * 2,q))
return A
@lru_cache(None)
def g(s):
x, steps = s
if x >= 21: return 'w'
if any(g(x) == 'w' for x in m(s)): return 'p1'
if all(g(x) == 'p1' for x in m(s)): return 'w1'
if any(g(x) == 'w1' for x in m(s)): return 'p2'
if all(g(x) == 'p1' or g(x) == 'p2' for x in m(s)): return 'w2'
if any(g(x) == 'w1' or g(x) == 'w2' for x in m(s)): return 'p3'
if all(g(x) == 'p1' or g(x) == 'p2' or g(x) == 'p3' for x in m(s)): return 'w3'
for s in range(1,21):
h = (s,(0,0))
if g(h) == 'p2':
print(s)
Не уверен в правильности хода Вани(3), но в целом код рабочий!
у тебя голос как у пятёрки...
ты сигма
бл я один нечего не понимаю?
брух
Лёша это бот!
Почему в задаче на две кучи 19 номер не считает? (не выдает никакой ответ,
спасибо большое