Criar o programa mais curto para verificar quem ganhou em uma n d tic tac toe game.
Seu programa deve funcionar quando n
(largura) e d
(número da dimensão) estiverem nestes intervalos:
n∈[3,6]∩ℕ ie a number from this list: 3,4,5,6
d∈[2,5]∩ℕ ie a number from this list: 2,3,4,5
n = 3; d = 2
(3 2 ou seja, 3 por 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3 ou seja, 3 por 3 por 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2 ou seja, 6 por 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
E assim por diante.
Vencendo (Se você já jogou o suficiente jogo da velha multidimensional, é o mesmo.)
Para que haja uma vitória, um jogador deve ter todos os quadrados adjacentes ao longo de uma linha. Ou seja, esse jogador deve ter n
movimentos em uma linha para ser um vencedor.
Adjacente:
- cada peça é um ponto; por exemplo (0,0,0,0,0) é um ponto em
d=5
- peças adjacentes são peças tais que são os dois pontos na mesma unidade d-cubo. Em outras palavras, a distância Chebyshev entre os blocos é 1.
- em outras palavras, se um ponto
p
é adjacente a um pontoq
, então todas as coordenadas emp
s coordenadas correspondentesq
diferem dele em não mais que um. Além disso, pelo menos no par de coordenadas difere em exatamente um.
Linhas:
- As linhas são definidas por vetores e um bloco. Uma linha é cada bloco atingido pela equação:
p0 + t
<
some vector with the same number of coordinates as p0>
Entrada :
A entrada será para STDIN. A primeira linha de entrada será dois números n
e d
no formato n,d
.
Depois disso, haverá uma linha composta por coordenadas, especificando os movimentos que foram feitos. Coordenadas serão listados no formulário: 1,1;2,2;3,3
. O canto superior esquerdo é a origem (0,0 para 2D). No caso geral, essa lista será como 1,2,...,1,4;4,0,...,6,0;...
onde o primeiro número representa esquerda-direita, a segunda cima-baixo, a terceira até a terceira dimensão, etc. Observe que a primeira coordenada é X
a primeira volta, a segunda é O
a primeira vez, ....
A entrada será seguida por uma nova linha.
Saída :
A saída será para STDOUT. Basta indicar quem ganhou se alguém ganhou ou se é um empate. Se não houver empate nem vitória, não produza nada.
Além disso, indique se há um conflito de movimentação, ou seja, se houver pelo menos duas jogadas no mesmo local.
Se houve uma vitória / empate antes do término da entrada, seu programa pode fazer o que quiser.
Casos de teste (alguém quer sugerir mais?):
Entrada:
4,3
0,0,0;1,1,1;1,0,1;2,0,2;0,0,1;2,0,0;2,0,1;3,0,2;3,0,1
Saída de exemplo:
X wins
Outra saída possível (requer explicação):
1
fonte
n
movimentos em uma linha para ser um vencedor. (Desculpe por não postar estas observações na caixa de areia, mas eu nem sequer têm tempo para sequer vê-lo lá porque foi publicado logo após sandboxing.)Respostas:
Python,
745578 caracteresFiz algumas alterações e reduzi-o bastante. Observe que um retorno de True significa que x ganhou, Falso significa y ganhou e significa que uma jogada inválida foi feita.
fonte
import *
paraimport*
. Use1
para True e0
para False (removaT
eF
).return -1
pode serreturn-1
(confira a remoção de espaços). Renomeie seus métodos em métodos de caracteres únicos. Confira dicas para mais otimizações.if l<>q:
vez deif not l==q:
.Não é uma resposta - Java
Eu estava curioso para ver quantas maneiras diferentes de ganhar para um determinado n, d, então escrevi esse código para listar todas elas.
Eu testei manualmente em n, d = 2..3,2..3 e parece funcionar ... depois disso, o número de maneiras possíveis de ganhar cresce rapidamente, como mostrado abaixo:
Tendo gerado todos os conjuntos de vitórias, eu poderia estender o programa para verificar a entrada fornecida contra os conjuntos vencedores, mas, é claro, esse método nunca venceria o golfe. Então, eu estava contente em parar por aqui - exceto que parecia que eu poderia encontrar uma solução de forma fechada para o número de maneiras de ganhar em função de n e d… É o número de maneiras de ganhar = 0,5 ((n + 2) ^ d - n ^ d).
fonte
C ++ 794
849caracteresA saída é: "X" (X vence), "O" (O vence) ou "!" (tentativa de movimento ilegal).
Isso apenas mapeia os pontos em uma matriz linear e verifica todos os subconjuntos possíveis de tamanho n, primeiro por serem constantes em X ou O e depois por estarem em uma linha. Para verificar se há uma linha, as coordenadas dos pontos em cada subconjunto são examinadas uma de cada vez; cada um deve aumentar de 0 a n-1, diminuir de n-1 a 0 ou ser constante. Os pontos são ordenados naturalmente na matriz linear; portanto, faz sentido chamar uma coordenada aumentando ou diminuindo para um determinado conjunto de pontos.
Agradecemos a Howard por apontar um erro grave na primeira versão.
Em solidariedade ao Quincunx, devo salientar que seria uma farsa se uma resposta em C ++ vencesse
fonte
X wins
ouO wins
. É perfeitamente legítimo produzir1
ou2
(ou alguma outra variação), desde que você explique em sua resposta o que eles representam. Como eu disse (grifo nosso): " indique quem ganhou".