Um TicTacToe
jogo pode ser representado por uma sequência que indica a sequência de posições à medida que os jogadores fazem seu movimento.
0 1 2 3 4 5 6 7 8
Suponha que X
sempre toque primeiro.
Portanto, uma sequência de "012345678" indica o jogo
XOX OXO XOX
Observe que o jogo já está ganho quando o jogador X
marca 6
, nesse ponto em que o jogo termina, concedendo uma vitória a X
. (ou seja, ignore os movimentos restantes quando o jogador vencer)
Seu desafio (código) é imprimir todos os jogos (ordem classificada) e seus resultados.
O formato
<movesequence>:<result>\n
por exemplo:
012345678:X
012345687:X
012345768:X
...
Indique X
para o 1º jogador vencedor, O
para o segundo jogador e D
para Empates.
Haverá 9!
(362880) jogos.
Aqui estão alguns dados para verificar seus resultados.
'X' Wins: 212256
'O' Wins: 104544
Draws : 46080
Este é um codegolf, e o tempo de execução deve ser dentro de um minuto. Diverta-se!
EDIT: Removido o excesso de detalhes, e apenas imprimi-lo stdout
. Não há necessidade de criar um arquivo.
Respostas:
Ruby 1.9, 201 caracteres
Ligeiramente golfe até agora. Demora cerca de 45 segundos para concluir aqui.
fonte
J, 124 caracteres
X vence, O vence e empate conta.
Foi um pouco doloroso para depurar embora. :)
fonte
Haskell,
224222 caracteresInfelizmente, a
permutations
função deData.List
não produz permutações em ordem lexográfica. Então, eu tive que gastar 6 caracteres no gênero.fonte
APL (139)
Provavelmente, isso pode ser mais reduzido, mas já foi difícil o suficiente. Acredite ou não, ele é executado em cerca de 45 segundos no meu computador (excluindo o tempo que leva para produzir tudo, quando é exibido na tela).
Explicação:
M←⍳9
: Armazene em M os números de 1 a 9. Internamente, este programa usa 1..9 em vez de 0..8.{
...}
: uma função para obter todas as permutações:1≥⍴⍵:↑,↓⍵
: se o comprimento for menor ou igual a 1, retorne o argumento como uma matriz.⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵
: caso contrário, remova cada caractere⍵
de⍵
, obtenha as permutações disso e adicione o caractere novamente.¨↓
: para cada permutação ...{
...}
: uma função que fornece ao vencedor essa permutação:⊃,/(,/⍕¨⍵-1),':',{
...}⍵
: obtém a permutação como uma string, com todos os números diminuídos em 1 (para obter a saída necessária de 0..8 em vez de 1..9), seguido de dois pontos, seguido do caractere que indica o vencedor:⍉5 2⍴0,⍨⍵
: separa os movimentos de X dos movimentos de O. Como O tem um movimento menor que X, esse espaço é preenchido0
, o que não é utilizado e, portanto, não influencia o resultado.{
...}¨↓
: para a placa X e a placa O, execute a seguinte função que determina se há uma vitória em um dos nove timesteps:(M∘.≥M)∧[2]M∊⍵
: Gere um bitboard a partir dos números de movimentação eand
esse bitboard com as strings100000000
,110000000
...111111111
para obter o estado do quadro em cada um dos nove momentos no tempo.{
...}¨↓
: para cada um deles, execute a seguinte função:⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'
: obtenha os bitboards para cada possível situação vencedora⍵∘{⍵≡⍵∧⍺}¨↓
:and
cada estado vencedor com o bitboard atual e verifique se o estado vencedor ainda está lá∨/↑
:or
estes juntos, informando se há uma vitória neste bitboard1∊T←↑
: crie uma matriz 9x2, com os 9 X-timesteps na primeira linha e os 9 O-timesteps na segunda linha. Guarde isso em T. Se houver um 1 nesta matriz, alguém ganhou.:'XO'[1+</+/T]
: Se alguém ganhou, dê 'X' ou 'O', dependendo de quem1
foi o primeiro.⋄'D'
: Se ninguém ganhou, dê 'D'.↑
: crie uma matriz a partir delas para que cada uma seja exibida em uma linha separada.fonte
Python Ungolfed
fonte
permutations
C ++ Ungolfed
fonte
Python 2.7 (237)
fonte