Tu objetivo es escribir un jugador perfecto para el juego de Wythoff's Nim .
Reglas de Nim de Wythoff
Wythoff's Nim es un juego determinista de dos jugadores que se juega con dos montones de fichas idénticas. Los jugadores alternan turnos, en los que hacen uno de estos:
- Retire uno o más contadores de la primera pila
- Eliminar uno o más contadores de la segunda pila
- Retire un número igual de contadores (uno o más), tanto del primer montón como del segundo montón.
Por supuesto, las pilas no pueden ir negativas, pero pueden llegar a 0. El jugador que quite el último contador en general gana el juego.
Para los de mentalidad más geométrica, aquí hay una formulación equivalente del juego que puedes jugar en este applet . Una sola reina comienza en un cuadrado de un tablero de ajedrez de un cuarto de infinito cuya esquina está en la esquina inferior izquierda. Los jugadores alternan moviendo a la reina, que se mueve como una reina del ajedrez pero restringida a tres direcciones:
- Abajo
- Izquierda
- Diagonalmente abajo y a la izquierda
El que mueve a la reina a la esquina gana.
Al asociar las coordenadas de la reina (con la esquina (0,0)
) a los tamaños de las pilas respectivas, es fácil ver que ambos juegos son iguales.
Juego perfecto
(Puede omitir esto si está familiarizado con las nociones de juego perfecto y movimientos ganadores).
Dado que Nim de Wythoff es un juego finito y determinista, tiene una noción de juego perfecto . Un jugador perfecto es una estrategia que siempre ganará desde una posición teóricamente ganada, lo que significa una posición en la que existe una estrategia que garantiza una victoria.
Para ser una estrategia ganadora, es suficiente moverse para moverse siempre a una posición ganadora teórica para el jugador que acaba de moverse y, por lo tanto, el jugador no sigue. La primera de estas posiciones ganadoras (también llamadas posiciones frías ) son (0,0), (1,2), (2,1), (3,5), (5,3)
. Consulte el artículo de Wikipedia para obtener una explicación de un algoritmo para encontrar una estrategia ganadora para Nim de Wythoff, así como una fórmula para generar posiciones ganadoras.
Requisitos del programa
Escribir un programa o función toma una posición como entrada y genera un movimiento ganador en la forma de la posición después de ese movimiento. Pocos bytes ganan.
Si no existe un movimiento ganador, es decir, la posición es una pérdida teórica, su programa debe indicarlo y perderlo.
Su programa debe ejecutarse dentro de un período de tiempo razonable. Por lo tanto, una búsqueda de árbol de juego recursiva exponencial no será suficiente. Si desea calcular previamente y codificar una estrategia, está bien.
Entrada
Un par (i,j)
de números no negativos que representan tamaños de pila, cada uno como máximo 99
. Pueden ser dos números, una tupla, una lista o el contenedor que prefiera.
Salida
Imprima o imprima la posición después de su movimiento, nuevamente como dos números o un contenedor de los mismos. Esto debe ser un movimiento legal a una posición ganadora. Si hay múltiples movimientos de este tipo, cualquiera está bien, pero solo uno.
Si no hay movimiento ganador, debe indicarlo en la salida. Cualquier salida como False
, None
, 0, o (-1,-1)
lo hará, siempre y cuando no sea una posición legal, y es el mismo para cada entrada perdedor.
Ejecuciones de ejemplo
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)