Criar um programa determinista para jogar n d tic-tac-toe com os outros concorrentes.
Seu programa deve funcionar quando n
(largura) e d
(número da dimensão) estiverem nestes intervalos:
n∈[3,∞)∩ℕ ie a natural number greater than 2
d∈[2,∞)∩ℕ ie a natural number greater than 1
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.
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, ....
Se este for o primeiro movimento, a entrada será um número seguido por 1 linha em branco.
Por consistência, a entrada sempre terminará com uma nova linha. Entrada de amostra (\ n é nova linha):
10,10\n0,0,0,0,0,0,0,0,0,0;0,2,3,4,5,6,7,8,9,0;0,1,2,3,4,5,6,7,8,9\n
Para o primeiro movimento:
10,10\n\n
onde \n
está o caractere de nova linha.
Resultado:
Envie a movimentação que você deseja fazer no mesmo formato que a entrada (uma lista separada por vírgula). Uma jogada inválida (isto é, uma que já foi realizada) resultará em uma perda para o jogo.
Nota: Você pode usar um gerador de números aleatórios, desde que o propague com um valor tal que cada execução seja idêntica, nas mesmas condições. Em outras palavras, o programa deve ser determinístico.
Nota: somente movimentos válidos são permitidos.
Jogos Vencedores (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>
Simulação e condições vencedoras:
Indique na sua resposta se está pronto para a classificação. Ou seja, indique claramente se sua resposta foi feita ou não.
Se sua resposta estiver marcada como concluída, ela não será classificada até pelo menos 24 horas após a última edição do código.
Os programas devem funcionar offline. Se um programa for trapaceado, ele receberá automaticamente uma pontuação de
-1
e não será mais pontuado. (Como alguém terminaria trapaceando com seus programas?)Se o seu programa produzir saída inválida, será imediatamente contada como uma perda para o jogo
Se você programar uma falha na produção após 1 minuto, será imediatamente contabilizado como uma perda para o jogo. Se necessário, otimize a velocidade. Não quero esperar uma hora para testar um programa fora de outro.
Cada programa será executado contra os outros programas duas vezes para cada um
n
no intervalo[3,6]
e cada umd
no intervalo[2,5]
, uma vezX
e uma vez comoO
. Esta é uma rodada.Para cada jogo que um programa vence, ele atinge
+3
sua pontuação. Se o programa empatou (1 vitória e 1 derrota em uma única rodada ou empata nos dois jogos), então+1
. Se o programa for perdido, será exibido+0
(ou seja, nenhuma alteração).O programa com a pontuação mais alta vence. Se houver empate, o programa com o menor número de jogos perdidos (fora dos competidores empatados) vence.
Nota: Dependendo do número de respostas, posso precisar de ajuda para executar os testes.
Boa sorte! E que as simulações sejam sempre a seu favor!
fonte
Respostas:
Python 3
Isso é simplesmente um ai aleatório. Ele seleciona aleatoriamente um movimento dentre os movimentos que ainda estão disponíveis.
fonte
Python 2.7
Esta é uma submissão de trabalho em andamento que estou fornecendo para fornecer um esqueleto / inspiração para outros respondentes. Ele funciona listando todas as linhas vencedoras possíveis e, em seguida, aplicando alguma heurística para pontuar essa linha de acordo com a sua importância. Atualmente, a heurística está em branco (trabalhos super-secretos). Também adicionei o tratamento de erros de vitória e choque.
Notas sobre o problema
Quantas linhas vencedoras existem? Considere o caso unidimensional; existem 2 vértices, 1 aresta e 1 linha. Em 2 dimensões, temos 4 vértices unidos por 2 linhas e 4 arestas unidas por 2 * n linhas. Em 3 dimensões, temos 8 vértices unidos por 4 linhas, 12 arestas unidas por 6 * n linhas e 6 faces unidas por
3*n^2
linhas.Em geral, vamos chamar um vértice de faceta 0, uma aresta de 1 faceta, etc. Em seguida, vamos
N(i)
denotar o número de facetas i,d
o número de dimensões en
o comprimento lateral. Então o número de linhas vencedoras é0.5*sum(N(i)*n^i,i=0..d-1)
.Por wikipedia,
N(i)=2^(d-i)*d!/(i!*(n-1)!)
a fórmula final é:sum(2^(d-i-1) n^i d! / (i! * (n-i)!),i=0..d-1)
qual wolfram | alpha não gosta muito. Isso fica muito grande rapidamente, então não espero que meu programa tenha tempo de execução gerenciável para d> 8.
Alguns resultados (desculpe pela formatação:
I / O
No momento, a entrada precisa ser inserida como:
tictactoe.py <ret> n,d <ret> move;move <ret>
- observe as várias linhas e nenhuma final;
.A saída parece
(x_1,x_2,x_3...)
, por exemplo:tictactoe.py <ret> 6,5 <ret> <ret>
=>0, 0, 0, 0, 0
tictactoe.py <ret> 6,5 <ret> 0,0,0,0,0;0,0,0,0,5 <ret>
=>0, 0, 0, 5, 0
Editar: para E / S, lógica adicionada. Eu acredito que isso agora está pronto para marcar
Observe que este comentário foi inicialmente um espaço reservado que eu excluí e cancelei.
fonte
Python 2
A maior parte do código é exatamente a mesma da IA aleatória do Quincunx . Em vez de selecionar aleatoriamente um movimento, ele escolhe o primeiro movimento disponível lexicograficamente (ou seja, (0,0, ... 0), depois (0,0, ... 1) e depois (0,0, ... 2) etc.).
Esta é uma estratégia bastante inútil, mas quase sempre é melhor do que jogar aleatoriamente.
fonte