Este desafío es escribir una función minimax en el idioma que elija, para obtener el siguiente mejor movimiento en un juego de NxN de tic-tac-toe dado el estado actual del tablero . La entrada de la placa se puede aceptar como una matriz, una colección 2D o cualquier otra cosa que tenga sentido para usted, pero que cumpla con las reglas . La salida es el siguiente mejor movimiento para quien sea el turno en este momento , donde se considera que X ha comenzado .
Antecedentes rápidos sobre el algoritmo Minimax
La idea básica del algoritmo minimax es enumerar todos los resultados posibles como un DAG y luego ponderarlos por el beneficio que la secuencia de movimientos tiene para el jugador, clave por el primer movimiento realizado. Todos los resultados posibles se `` agrupan '' en el primer movimiento y se puntúan en función de la suma de todos los resultados (-1 para una pérdida, 0 para un empate y un 1 para una victoria). En implementaciones que requieren que jueguen varios jugadores, enumeras todos los movimientos posibles del jugador y todas las respuestas posibles de los oponentes también. Por ejemplo, en un juego de tic-tac-toe (después del primer movimiento) hay 8 posibles primeros movimientos que puedes hacer, y todos pueden parecer iguales cuando solo analizas el siguiente turno. Pero al iterar a través de todos los resultados posibles para cada conjunto posible de movimientos que resultan en un resultado final y resumirlos todos,
Para obtener un resumen mejor, más profundo y contextual del algoritmo mini-max en términos de tic-tac-toe, lea más aquí: http://neverstopbuilding.com/minimax
XKCD (solo solución 3x3)
Las normas
- Se puede usar cualquier idioma, pero no se permiten bibliotecas externas de minimax.
- La salida puede ser una coordenada (0-n, 0-n) o un número (1-n * n) indicativo del mejor próximo movimiento.
- Además de esto, debe poder identificar cuándo el mejor de los casos es una pérdida o un empate en lugar de una victoria.
- La forma en que denota una pérdida o un empate depende, una vez más, de usted.
- La entrada debe usar las X y O tradicionales, y debe asumir que X se mueve primero; los espacios en blanco se pueden representar por cualquier cosa.
- Puede suponer que las entradas que entran en su programa tienen n O y n + 1 X, en otras palabras, puede suponer que está obteniendo una placa bien formada.
- El estado actual de la placa debe ser la única entrada a su programa, si está utilizando recursividad, se deben realizar métodos auxiliares para facilitar los requisitos de entrada. Consulte /codegolf//a/92851/59376 para obtener una aclaración.
- Cualquier valor de 10> = n> = 1 debe ser compatible; si su programa "agota el tiempo de espera" para n> 10, también me parece aceptable, ya que algunos idiomas tienen un poder de procesamiento significativamente menor (especialmente usando consolas orientadas a la web).
Juzgar
- Este es el código de golf, por lo que el conteo de bytes más bajo del programa gana y las lagunas estándar se rechazan universalmente.
- En caso de empate, ganará el programa que admita la 'n' más grande.
Entradas de ejemplo
2x2
[[X,O]
[-,-]]
Salida: 2 o [0,1] (3 o [1,1] también sería posiblemente correcto) (alguna forma de indicación de la ubicación, arbitraria siempre que pueda explicar fácilmente el formato que utilizó)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Salida: -1 (pérdida)
Una vez más, se permite cualquier formato de entrada que desee, pero se deben usar X y O, los ejemplos proporcionados no estaban destinados a restringir a ese formato, solo a inspirar.