Привет друг! Проблемы с теорией игр? В этой статье мы разберем код, который решает любые прототипы стандартных 19-21 задач из КЕГЭ. Чтобы максимально понять ниже описанный код, я крайне рекомендую сначала научиться решать эти задачи ручками.
Условие
- Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
- Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
- Петя не может выиграть за один ход;
- Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
- Найдите минимальное значение S, при котором одновременно выполняются два условия:
- у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
- у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Решение
Winpos
Первым делом нам надо написать функцию, которая будет возвращать True если игрок находиться в выигрышной позиции и False если игрок не находиться в выигрышной позиции.
Python на практике / Пишем 3 программы на Питон за 5 минут
Обозначим переменные count1 и count2 как количество камней в 1 и 2 куче соответственно.
Если изначально суммарное количество камней в кучах меньше 61
if (count1 + count2 61)
Enter fullscreen mode
Exit fullscreen mode
и при любом следующем ходе оно становиться больше либо равно 61
((count1 + count2 + 1 >= 61) or (count1 * 4 + count2 >= 61) or (count1 + count2 * 4 >= 61))
Enter fullscreen mode
Exit fullscreen mode
то мы возвращаем True, что означает что игрок находиться в выигрышной позиции.
Иначе мы возвращаем False, что означает что игрок не находиться в выигрышной позиции.
def winpos(count1, count2): if (count1 + count2 61) and ((count1 + count2 + 1 >= 61) or (count1 * 4 + count2 >= 61) or (count1 + count2 * 4 >= 61)): return True else: return False
Enter fullscreen mode
Exit fullscreen mode
Первая функция готова, приступим к написанию следующей.
Losspos
Теперь нам надо написать функцию, которая будет возвращать True если игрок находится в проигрышной позиции и False если игрок не находится в проигрышной позиции.
Если изначально игрок не находиться в выигрышной позиции
if not winpos(count1, count2)
Enter fullscreen mode
Exit fullscreen mode
и каждый следующий ход противника является выигрышным
(winpos(count1 + 1, count2) and winpos(count1, count2 + 1) and winpos(count1 * 4, count2) and winpos(count1, count2 * 4))
Enter fullscreen mode
Exit fullscreen mode
то мы возвращаем True, что означает что игрок находиться в проигрышной позиции.
Иначе, мы возвращаем False, что означает что игрок не находиться в проигрышной позиции.
def losspos(count1, count2): if not winpos(count1, count2) and (winpos(count1 + 1, count2) and winpos(count1, count2 + 1) and winpos(count1 * 4, count2) and winpos(count1, count2 * 4)): return True else: return False
Enter fullscreen mode
Exit fullscreen mode
Вторая функция готова, осталась еще одна.
Prewinpos
Последняя функция должна возвращать True если игрок находится в предвыигрышной позиции и False если игрок не находится в предвыигрышной позиции.
Если изначально игрок не находится в выигрышной позиции
if not winpos(count1, count2)
Enter fullscreen mode
Exit fullscreen mode
и любой следующий ход противника является проигрышным
(losspos(count1 + 1, count2) or losspos(count1, count2 + 1) or losspos(count1 * 4, count2) or losspos(count1, count2 * 4)):
Enter fullscreen mode
Exit fullscreen mode
то мы возвращаем True, что означает что игрок находится в предвыигрышной позциии.
Иначе, мы возвращаем False, что означает что игрок не находиться в предвыигрышной позциии.
def prewinpos(count1, count2): if not winpos(count1, count2) and (losspos(count1 + 1, count2) or losspos(count1, count2 + 1) or losspos(count1 * 4, count2) or losspos(count1, count2 * 4)): return True else: return False
Enter fullscreen mode
Exit fullscreen mode
Основа готова, осталось просто перебрать значения, чем мы сейчас и займемся.
1 Задача
Условие задачи можно воспринимать так: «Ваня находиться в выигрышной позиции(выигрывает за один ход)».
Изначально в первой куче 3 камня
count1 = 3
Enter fullscreen mode
Exit fullscreen mode
а во второй куче S камней, 1 ≤ S ≤ 57
for s in range(1, 58):
Enter fullscreen mode
Exit fullscreen mode
Перебираем все возможные комбинации с S, при которых игрок находится в выигрышной позиции
if winpos(count1 + 1, s) or winpos(count1, s + 1) or winpos(count1 * 4, s) or winpos(count1, s * 4):
Enter fullscreen mode
Exit fullscreen mode
и если хоть одна такая комбинация существует, то мы выводим S на экран и прерываем цикл.
print(«19:», s) break
Enter fullscreen mode
Exit fullscreen mode
Получается следующий код, который решает эту задачу
count1 = 3 for i in range(1, 58): if winpos(count1 + 1, i) or winpos(count1, i + 1) or winpos(count1 * 4, i) or winpos(count1, i * 4): print(«19:», i) break
Enter fullscreen mode
Exit fullscreen mode
2 Задача
Условие задачи можно воспринимать так: «Ваня находится в проигрышной позиции».
Перебираем все возможные комбинации с S, при которых игрок находиться в проигрышной позиции, и если такие комбинации существуют, то мы выводим S на экран
for i in range(1, 58): if losspos(count1 + 1, i) or losspos(count1, i + 1) or losspos(count1 * 4, i) or losspos(count1, i * 4): print(«20:», i)
Enter fullscreen mode
Exit fullscreen mode
3 Задача
Условие задачи можно воспринимать так: «Ваня находиться или в выигрышной или в предвыигрышной позиции»
Перебираем все возможные комбинации с S, при которых игрок находиться или в выигрышной или в предвыигрышной позиции, и если такие комбинации существуют, то мы выводим S на экран
if (winpos(count1 + 1, i) or predwinpos(count1 + 1, i)) and (winpos(count1, i + 1) or predwinpos(count1, i + 1)) and (winpos(count1 * 4, i) or predwinpos(count1 * 4, i)) and (winpos(count1, i * 4) or predwinpos(count1, i * 4)): print(«21:», i)
Enter fullscreen mode
Exit fullscreen mode
2 Способ
Подробней с этим методом решения теории игр вы можете ознакомится на канале Алексея Кабанова
Мемоизация
Для оптимизации рекурсии подключим декоратор cache из модуля functools.
from functools import cache
Enter fullscreen mode
Exit fullscreen mode
Moves
Напишем функцию moves, которая принимает количество камней в обеих кучах и возвращает всевозможные варианты ходов.
def moves(heap): a, b = heap return (a + 1, b), (a * 4, b), (a, b + 1), (a, b * 4)
Enter fullscreen mode
Exit fullscreen mode
Game
Напишем функцию game, которая рекурсивно описывает игру.
Enter fullscreen mode
Exit fullscreen mode
1-3 задача
Перебираем все значения s и выводим на экран необходимые данные.
for s in range(57, 0, -1): print(s, «: «, game((3, s)), » | «, [game(x) for x in moves((3, s))])
Enter fullscreen mode
Exit fullscreen mode
На выходе мы получаем полное дерево игры, в котором можно увидеть ответы на поставленные задачи.
Источник: dev.to
Какая самая сложная концепция иметь дело с в Python?
Когда дело доходит до Python, вы обнаружите, что вы забираете многих концепций довольно быстро. Да, там … Теги с Python.
Когда дело доходит до Python , вы обнаружите, что вы собираете много концепций довольно быстро. Да, здесь будут некоторые вещи и там, которые могут дать вам некоторые проблемы – вы изучаете новый язык в конце концов, но сходство на английский язык сделает Обучение Python гораздо легче взять на себя, чем Обучение C. или JavaScript Отказ
В целом, Python – очень простая концепция, чтобы понять. Все написано таким образом, который чистый и легко читать. Кроме того, вы, скорее всего, почувствуете код, который вы никогда не использовали быстрее, чем в других программах, из-за неистового языка Python был разработан. Что говорится, что есть некоторые разочарования, которые каждый программист работает при работе с кодом. Вот несколько, которые вы можете испытать во время работы с Python.
Отступы
Хотя отступ обычно является просто раздражающая практика, которую программисты либо живут, и умеют или небрежно игнорировать, нет, не обогащаю его с помощью Python. Отступ встроен прямо в язык программирования Python, поэтому вам придется быстро учиться, если вы хотите что-то построить!
Python хочет четыре пробела для каждого идентификатора:
while i < 10: i = i + 1 if i == 5: print(«5»)
Итак, отступ не все плохо – он делает ваш код более читабельным, проще для обслуживания и гораздо проще отлаживать. Когда вы получаете это, он начнет чувствовать себя как вторая природа. Кроме того, есть дополнительная серебряная подкладка. Многие из проблем синтаксиса, которые поставляются с другими языками, не перенесут Python, потому что вам не придется беспокоиться о скобках, двоеточиях, точках спячении и тому подобное.
Документация
Эта жалоба в значительной степени универсальна для кодеров каждого языка программирования – документация может быть болью, чтобы сортировать. Это особенно верно, если ваш источник предпочитает загружать необработанные документы вместо того, чтобы сделать более удобную версию. Ики!
Что говорится, Документация Pythons имеет тенденцию быть мильми впереди других языков с точки зрения читабельности. Это может занять вам некоторое время, чтобы получить это, но вы постепенно начнете начать интуитивно понимание контента, как вы становитесь более опытным.
Обязательно ищите любые примеры, которые могут быть даны дальше в документацию, и попытаться учиться, применяя синтаксис, написанный в примере. Когда вы выяснили, как правильно использовать пример в DOC, вернитесь и прочитайте первый раздел. Все будет намного яснее!
Также есть много примеров, когда вы ищете в Интернете, которые иногда более глубокие или широкие, чем официальные документы. Не забудьте стопку стойки.
Написание программ
Когда дело доходит до него, самая сложная часть любого языка просто выясняет, как вы хотите применить то, что вы узнали. Прогуливаясь по учебникам и читающим информационным статьям будет легкой частью – реальная задача возникает из создания идеи и просмотра ее до плода.
Что, как говорится, есть способ, которым вы можете бороться с этим вопросом. Ответ прост – начните с создания журнала, который вы можете использовать для регистрации всех идей, которые у вас есть для разных программ и приложений. Когда вы делаете это, обязательно добавьте несколько заметок по разным способам создания структуры программы – это будет очень полезно позже.
Читайте ещё по теме:
- Модуль Python Jokes для добавления шуток в проект
- Почему Новички Должны Изучать Python
- Java vs Python: Битва Лучших
- Понимание виртуальных сред в Python
- Переопределение в Python
- 6 лучших библиотек NLP Python NLP
- Печать («Привет, мир!»)
Источник: pythobyte.com
Самые сложные программы на питоне
Пары чисел с минимальной разностью
Напишите функцию, которая будет принимать список чисел и возвращать два числа, абсолютная разность которых минимальна. Пару чисел нужно вернуть в виде списка, отсортированного по возрастанию.
Вложенность слов
Напишите функцию, которая будет принимать начальное слово и итоговую строку и возвращать уровень вложенности.
Пробелы
В предложение были добавлены лишние пробелы. Напишите функцию, которая будет принимать такое предложение и возвращать его же в исправленном виде.
Прямоугольник в круге
Напишите функцию, которая будет принимать три числа: ширину и высоту прямоугольника и радиус круга и возвращать True, если прямоугольник может поместиться в круг.
Буквы-подруги
Напишите функцию, которая будет принимать строку и две буквы. Функция должна проверять, всегда ли после первой переданной буквы идет вторая.
Число с плавающей точкой
Создайте регулярное выражение для проверки того, является ли строка валидным числом с плавающей точкой. Обратите внимание: написать нужно паттерн, а не функцию.
Сиракузская последовательность
Сиракузская последовательность генерируется следующим образом. Берем любое натуральное число n. Если оно четное, то делим его на 2, а если нечетное, то умножаем на 3 и прибавляем 1 (получаем 3n + 1).
Больше, чем сумма?
Напишите функцию, которая будет принимать список чисел и проверять, является ли каждое число больше суммы всех предыдущих чисел.
Картина, корзина, картонка и маленькая собачонка
Напишите функцию, которая будет принимать словарь и строку — кличку собаки (в нижнем регистре). Ключами словаря будут названия пропавших вещей (и кличка собаки, если она пропала), а значениями — их стоимость.
Сборка машинок
Вы занимаетесь сборкой игрушечных машинок. Каждая машинка должна иметь четыре колеса, один корпус и две фигурки человечков внутри.
Источник: pythonist.ru