TicTacToe
Игра может быть представлена в виде строки , обозначающее последовательность позиций , как игроки делают свой ход.
0 1 2 3 4 5 6 7 8
Предположим, X
всегда играет первым.
Таким образом, строка «012345678» обозначает игру
XOX OXO XOX
Обратите внимание, что игра уже выиграна, когда игрок X
отмечает 6
, в этот момент игра заканчивается, предоставляя выигрыш X
. (т.е. игнорировать оставшиеся ходы, как только игрок выигрывает)
Ваша задача (код) - распечатать все игры (отсортированный порядок) и их результаты.
Формат
<movesequence>:<result>\n
например:
012345678:X
012345687:X
012345768:X
...
Обозначим X
выигрыш первого игрока, O
второго игрока и D
ничьи.
Будет 9!
(362880) игр.
Вот некоторые данные, чтобы проверить ваши результаты.
'X' Wins: 212256
'O' Wins: 104544
Draws : 46080
Это Codegolf, и время выполнения должно быть в течение минуты. Веселиться!
РЕДАКТИРОВАТЬ: Удалил лишние детали и просто распечатать его stdout
. Нет необходимости создавать файл.
Ответы:
Ruby 1.9, 201 символов
Слегка поиграл в гольф. Займет около 45 секунд, чтобы завершить здесь.
источник
J, 124 символа
X победа, O победа и ничья подсчитывают.
Было немного больно отлаживать, хотя. :)
источник
Haskell,
224222 персонажаУвы,
permutations
функция fromData.List
не производит перестановок в лексографическом порядке. Поэтому мне пришлось потратить 6 символов на сортировку.источник
APL (139)
Это, вероятно, может быть сокращено больше, но это было достаточно сложно, как есть. Хотите верьте, хотите нет, но на моем компьютере он работает примерно за 45 секунд (исключая время, которое требуется для вывода всего, когда выводится на экран).
Объяснение:
M←⍳9
: Сохраните в M числа от 1 до 9. Внутренне эта программа использует 1..9 вместо 0..8.{
...}
: функция для получения всех перестановок:1≥⍴⍵:↑,↓⍵
: если длина меньше или равна 1, вернуть аргумент в виде матрицы.⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵
: в противном случае удалите каждый символ⍵
из⍵
, получите его перестановки и добавьте его обратно.¨↓
: для каждой перестановки ...{
...}
: функция, которая дает победителя для этой перестановки:⊃,/(,/⍕¨⍵-1),':',{
...}⍵
: получить перестановку в виде строки со всеми числами, уменьшенными на 1 (чтобы получить требуемый вывод 0..8 вместо 1..9), за которым следует двоеточие, за которым следует символ, обозначающий победителя:⍉5 2⍴0,⍨⍵
: отделить ходы X от ходов O. Поскольку у O один ход меньше X, это пространство заполнено0
, которое не используется и поэтому не влияет на результат.{
...}¨↓
: и для доски X, и для доски O выполните следующую функцию, которая определяет, есть ли выигрыш на одном из девяти временных шагов:(M∘.≥M)∧[2]M∊⍵
: Создать битборд из чиселand
ходов , и этот битборд с цепочками битов100000000
,110000000
...111111111
чтобы получить состояние доски в каждый из девяти моментов времени.{
...}¨↓
: для каждого из них запустите следующую функцию:⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'
: получить битборды для каждой возможной выигрышной ситуации⍵∘{⍵≡⍵∧⍺}¨↓
:and
каждое состояние выигрыша с текущим битбордом и проверка, если указанное состояние выигрыша все еще существует∨/↑
:or
это вместе, давая, есть ли победа на этой доске1∊T←↑
: создайте матрицу 9x2 с 9-кратными временными шагами в первом ряду и 9-кратными временными шагами во втором ряду. Сохраните это в T. Если в этой матрице есть 1, кто-то выиграл.:'XO'[1+</+/T]
Если кто-то победил, дайте «Х» или «О» в зависимости от того, кто1
был первым.⋄'D'
: Если никто не победил, дайте 'D'.↑
: сделать из них матрицу, чтобы каждый из них отображался в отдельной строке.источник
Python Ungolfed
источник
permutations
C ++ Ungolfed
источник
Python 2,7 (237)
источник