Crear el programa más corto para comprobar que ha ganado en un n d juego de tic tac toe.
Su programa debería funcionar cuando n
(ancho) y d
(número de dimensión) están en estos rangos:
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 es decir, 3 por 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3 es decir, 3 por 3 por 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2 es decir, 6 por 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
Y así.
Ganar (si has jugado suficientes tic tac toe multidimensionales, esto es lo mismo).
Para que haya una victoria, un jugador debe tener todos los cuadrados adyacentes a lo largo de una línea. Es decir, ese jugador debe tener n
movimientos en una línea para ser un ganador.
Adyacente:
- cada azulejo es un punto; por ejemplo (0,0,0,0,0) es un punto en
d=5
- las fichas adyacentes son fichas, de modo que ambos son puntos en la misma unidad d-cubo. En otras palabras, la distancia de Chebyshev entre las fichas es 1.
- en otras palabras, si un punto
p
es adyacente a un puntoq
, entonces cada coordenada enp
la coordenada correspondiente noq
difiere de ella en más de uno. Además, al menos en el par de coordenadas difiere exactamente en uno.
Líneas:
- Las líneas están definidas por vectores y un mosaico. Una línea es cada mosaico golpeado por la ecuación:
p0 + t
<
some vector with the same number of coordinates as p0>
Entrada :
La entrada será a STDIN. La primera línea de entrada será dos números, n
y d
en la forma n,d
.
Después de esto, habrá una línea que consiste en coordenadas que especifican los movimientos que se han realizado. Coordenadas se mostrarán en el formulario: 1,1;2,2;3,3
. La esquina superior izquierda es el origen (0,0 para 2D). En el caso general, esta lista será como 1,2,...,1,4;4,0,...,6,0;...
donde el primer número representa izquierda-derecha-ness, el segundo arriba-abajo-ness, el tercero a la 3ra dimensión, etc. Tenga en cuenta que la primera coordenada es X
el primer giro, el segundo es O
el primer turno ...
La entrada será seguida por una nueva línea.
Salida :
La salida será a STDOUT. Simplemente indique quién ganó si alguien ganó, o si es un empate. Si no es un empate ni una victoria, no generes nada.
Además, indique si hay un choque de movimientos, es decir, si hay al menos dos movimientos en la misma ubicación.
Si hubo una victoria / empate antes de que finalizara la entrada, su programa puede hacer lo que quiera.
Casos de prueba (¿alguien quiere sugerir algo más?):
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
Salida de ejemplo:
X wins
Otra salida posible (requiere explicación):
1
fuente
n
movimientos en una línea para ser un ganador. (Perdón por no publicar estos comentarios en el sandbox, pero ni siquiera tuve tiempo de verlo allí porque fue publicado tan pronto después del sandboxing)Respuestas:
Python,
745578 caracteresHice algunos cambios y lo reduje bastante. Tenga en cuenta que un retorno de Verdadero significa que x ha ganado, Falso significa que ganó, y significa que se realizó un movimiento no válido.
fuente
import *
aimport*
. Use1
para Verdadero y0
para Falso (eliminarT
yF
).return -1
puede serreturn-1
(echa un vistazo a la eliminación de espacios). Cambie el nombre de sus métodos a métodos de caracteres únicos. Consulte los consejos para obtener más optimizaciones.if l<>q:
lugar deif not l==q:
.No es una respuesta - Java
Tenía curiosidad por ver cuántas maneras diferentes había de ganar para un determinado n, d, así que escribí este código para enumerarlos a todos.
Lo probé a mano en n, d = 2..3,2..3 y parece funcionar ... después de eso, la cantidad de formas posibles de ganar crece rápidamente como se muestra a continuación:
Después de haber generado todos los conjuntos ganadores, podría extender el programa para verificar la entrada dada contra los conjuntos ganadores, pero, por supuesto, ese método nunca ganaría el golf. Así que me contenté con detenerme aquí, excepto que parecía que podría encontrar una solución de forma cerrada para la cantidad de formas de ganar en función de n y d ... Es la cantidad de formas de ganar = 0.5 ((n + 2) ^ d - n ^ d).
fuente
C ++
794849caracteresLa salida es: "X" (X gana), "O" (O gana) o "!" (intento de movimiento ilegal).
Esto simplemente asigna los puntos en una matriz lineal y verifica todos los subconjuntos posibles de tamaño n, primero por ser constantes en X u O, y luego por estar en una línea. Para verificar que esté en una línea, las coordenadas de los puntos en cada subconjunto se examinan de una en una; cada uno debe estar aumentando de 0 a n-1, disminuyendo de n-1 a 0, o constante. Los puntos se ordenan naturalmente en la matriz lineal, por lo que tiene sentido llamar a una coordenada aumentando o disminuyendo para un conjunto dado de puntos.
Gracias a Howard por señalar un grave error en la primera versión.
En solidaridad con Quincunx, debo señalar que sería una parodia si gana una respuesta de C ++
fuente
X wins
oO wins
. Es perfectamente legítimo emitir1
o2
(o alguna otra variación) siempre que explique en su respuesta lo que significan. Como dije (énfasis agregado): " indique quién ganó".