Это последний день года, и я подумал, что, возможно, мне стоит поделиться одним последним постом о проблеме кодирования, прежде чем мы приветствуем, надеюсь, лучший 2021 год!

Я обнаружил интересную проблему проверки на Edabit, которая может помочь пересмотреть некоторые концепции манипуляций со списками Python. Предположим, вам было поручено написать программу для определения победителя в каждой игре в крестики-нолики - X для игрока 1 и O для игрока 2, как мы могли бы это сделать?

Пожалуйста, не читайте дальше, если вы хотите сначала попытаться решить проблему без спойлеров.

Если вы помните, игра в крестики-нолики включает в себя сетку 3 на 3, где первый игрок, который проведет серию - по горизонтали, вертикали или диагонали - выиграет игру.

Интересным фактом об игре является то, что математически можно доказать, что существует равновесие по Нэшу в соответствии с теорией игры, когда два рациональных игрока, лучше всего угадывающие друг друга, всегда приводят к ничьей. Ключевой принцип равновесия по Нэшу заключается в том, что игрок не может улучшить свое положение в одностороннем порядке, пытаясь отклониться от него - отсюда и термин равновесие.

Переходя от рациональной экономики, наша компьютерная программа должна будет проверять многие игры между двумя игроками, которые не всегда могут играть оптимально.

Приведенный выше код не является точной копией ответа, но шаги расчета по-прежнему применяются.

Скажем, x - это аргумент списка списков, представляющих X и Os в игре, где каждый элемент представляет собой односимвольную строку.

Мы могли бы решить, сопоставив горизонтальные, вертикальные и диагональные линии, чтобы проверить, есть ли у нас победитель. Используя понимание списка, мы могли бы собирать строки как строки, например «XOX» или «OOX», что дает 8 возможных линий - 3 горизонтальных, 3 вертикальных и 2 диагональных.

Для горизонтальных линий мы могли бы получить их, просто объединив каждый список в соответствии с кодом в строке 2. Для вертикальных линий мы могли бы транспонировать их, распаковав списки, а затем повторно комбинируя их с помощью zip (* x) , как в примере, или просто используя понимание списка через [[x [r] [c] for r in range (len (x))] for c in range (len (x [ 0]))], первая из которых менее интуитивна, но более лаконична.

Диагонали могут быть найдены, если номера строк и столбцов идентичны (верхний левый нижний правый) или номер столбца равен 2 минус номер строки, при условии, что мы используем индекс на основе 0.

Последние два шага вернут Игрока 1 в качестве победителя, если удастся найти X-серию. В противном случае мы возвращаем Игрока 2 победителем, если обнаружена серия «O», или объявляем ничью / отсутствие победителя в противном случае.

Надеюсь, вам понравилось чтение. Счастливого Нового года!