Escreva um programa que mostre todas as posições possíveis do Tic Tac Toe, incluindo o resultado do jogo correspondente. Evite saída duplicada de posições iguais.
O programa não aceita entrada.
Regras:
- Uma saída de posição deve consistir em 9 caracteres, usando
X
eO
para os quadrados tirados, e um caractere não-espaço em branco arbitrário para os quadrados em branco - Cada posição deve ser impressa em 3 linhas / colunas, com uma linha em branco como separador entre duas posições.
- Caracteres adicionais de espaço em branco / linhas em branco / desenho da caixa são bem-vindos
- O jogador X vai primeiro
O resultado pode ser um dos seguintes:
- X venceu
- O ganhou
- Desenhar
- Jogo em progresso
Você pode escolher uma visualização adequada do resultado da posição, por exemplo, como texto colorido ou como anotação textual, desde que seja colocada perto da posição correspondente
- As posições são consideradas iguais se uma puder ser obtida da outra por rotação ou espelhamento. As posições duplicadas não devem ser impressas. (Em outras palavras, imprima apenas as classes de igualdade.)
Por exemplo, imprima apenas um dos seguintes:
X•• ••X ••• •••
••• ••• ••• •••
••• ••• X•• ••X
- Isso é código-golfe , então o código mais curto vence!
Saída de amostra:
•••
•••
••• -
X••
•••
••• -
•X•
•••
••• -
•••
•X•
••• -
[…]
XXO
OOX
XXO /
OXO
XXX
OXO X
Dica: Existem 765 posições, com 91 vitórias em X, 44 vitórias em O e 3 empates.
Uma pergunta semelhante foi feita antes, mas esta é diferente.
code-golf
tic-tac-toe
ThomasR
fonte
fonte
Respostas:
Geléia ,
192179168 bytesExperimente online! (Demora cerca de 30 segundos, então seja paciente).
Como funciona
Visão geral de alto nível:
Em etapas intermediárias, isso armazena X como
1
, não colocado como0
e O como-1
. O programa gera todas as possibilidades 3 ^ 9 e, em seguida, mantém apenas as posições válidas com base no atendimento aos três critérios:Em seguida, o programa substitui cada estado do jogo por todas as suas rotações e reflexões para obter uma lista de todas as classes de equivalência. Esta é a operação que leva a maior parte do tempo.
O primeiro estado do jogo é retirado de cada uma das classes de equivalência, e quem ganha é calculado.
Onde isso acontece As linhas são numeradas para facilitar a leitura
fonte
Ruby, 305 bytes
Isso funciona de maneira semelhante às outras respostas, pois gera todas as
3**9
placas e depois filtra as válidas. Internamente, usamos números ternários0=X 1=. 2=O
na saída. Iterec
pelos 3 valores possíveis para o centro es
pelos3**8 = 6561
valores do perímetro. Antes de converteri/3
para uma representação de seqüência de caracteres de um número ternário, multiplicamos por6562
para duplicar todos os dígitos e adicionamos3**16
para iniciar o número com 1, a fim de garantir que haja zeros à esquerda, quando aplicável.w
é a condição de vitória - defina como zero.Para cada placa, repita 4 rotações dos dígitos
s
para encontrar a versão lexicamente mais baixa do atual número ternário de 8 dígitos que representa o perímetro. Ao mesmo tempo, adicione os valores ASCII dos três primeiros dígitos (linha superior da rotação atual) e use-o para verificar se há uma vitória. Além disso, adicione os valores ascii dec
e um par de dígitos diametralmente opostos para verificar se há uma vitória no centro.Verifique se a saída é válida - Se os bits 1 e 64
w
estiverem definidos, ambos os lados vencem - isso não é válido. Verifique o saldo de X e O (se ainda não houver vencedor, ele pode ser igual a X e O ou mais um X - mas se o jogo for vencido, existe apenas um valor possível, pois o vencedor deve ter passado por último.) Para evitar mostrar rotações diferentes da mesma placa, somente produza saída se a versão lexicamente mais baixa do perímetro corresponder ao valor atual des[2,9]
.Saída da placa , sustentando os símbolos
tr("012","X.O")
. O status do jogo é mostrado abaixo do tabuleiro. Se w = 0, isso ocorretrue
se ainda houver quadrados vazios (o jogo ainda está em andamento) efalse
se o tabuleiro estiver cheio. Sew
for diferente de zero, produzimos1
se o jogador 1 (X) venceu ou64%31==2
se o jogador 2 (O) venceu.Ungolfed
Esquema de verificação
Os diagramas abaixo mostram o esquema de rotação (e verificação de vitórias, em maiúsculas). Os diagramas são mostrados sem rotação. As quatro rotações diferentes são tomadas como substrings na cópia dupla de
i/3
, com as 3 letras maiúsculas consecutivas no perímetro de cada diagrama (o "topo" por rotação atual) sendo os 3 primeiros caracteres na substring de 9 caracteres. Para cada rotação, também é tentada a reversão de 9 caracteres (rotação diagonal sobre o eixo AE ou CG). A placa é emitida apenas se o valor atual dei/3
é o mais baixo lexicamente de todas as rotações e espelhos.fonte
Python 2 ,
648620 bytesExperimente online!
Provavelmente um pouco de golfe menor é possível aqui com essa abordagem; mas não muito.
Edit: Thx para ovs, que notou um ajuste ganhando 28 bytes; e 3 de Artemis Fowl
Código não golfe
A idéia básica aqui é: força bruta cada uma das codificações possíveis de 3 ^ 9 = 19683. Mantenha o controle dos conjugados (rotações e reflexões) das placas que já foram examinadas para não duplicar as entradas. No mínimo, as placas válidas devem ter um número igual de X e O ou mais um X que O. Não é possível obter uma vitória para X e uma vitória para O; além de algumas restrições adicionais complicadas.
fonte
Counter
. Você pode substituí-lo porc=b.count;d=c(x)-c(o)
return
pode serreturn 0if d not in[0,1]else 0if w and v else(x*(d==1))if w else(o*(d==0))if v else'.'if'.'in b else'/'