En el juego 15, dos jugadores se turnan para seleccionar números del 1 al 9 (sin elegir ningún número que cualquiera de los jugadores ya haya seleccionado). Un jugador gana si tiene tres números que suman 15. Si todos los números han sido seleccionados y ninguna combinación de ninguno suma 15, el juego es un empate.
Su tarea es construir una función que tome el estado de un juego de 15 (representado en cualquier forma que desee) y devuelva qué número mover a continuación, que actuará como una IA para jugar el juego con otro jugador. Puede suponer que la posición es legal (ningún jugador tiene más de un número más que el otro jugador, y ningún jugador ya tiene tres números que sumen 15).
La IA debe ser perfecta, es decir, si se le da una posición ganadora, debe forzar una victoria, y si se le da una posición no perdedora (una posición donde su oponente no tiene una estrategia ganadora), no debe permitir su oponente para darle una posición perdedora (que es posible, ya que 15 es un juego resuelto).
El código más corto gana.
(nota: aceptaré la respuesta más corta actualmente y la cambiaré si aparece una respuesta más corta).
Respuestas:
GolfScript (
129 86 81 8575 caracteres)Formato de entrada esperado:
[[int int ...][int int ...]]
donde la primera lista son mis números y la segunda lista son los números de mi oponente. Para pruebas interactivas, agregue~N
al final del script y proporcione una cadena en ese formato: por ejemploHeurística:
5
es el único número que puede contribuir a ganar de 4 maneras, así que cógelo si está disponible.Marco de prueba:
fuente
[5][3]
(Debería devolver 4 u 8).9
- Pero parece que has cambiado las reglas.4
o8
?7
debe funcionar, por lo que9
es aceptable.Rubí,
330 315341 caracteresRetendré los detalles por ahora, pero digamos que se basa en el algoritmo óptimo para un problema similar que también se ha resuelto y cuyo algoritmo óptimo funciona igual de bien aquí.
Se han hecho suposiciones: esto elegirá movimientos malos en situaciones que no pueden ser producidas por este algoritmo jugando contra otro jugador, solo por dos jugadores uno contra el otro.Entrada: una matriz de dos matrices de cadenas de un dígito. Cada conjunto representa los valores tomados por un jugador: el primero es la IA, el segundo es el oponente.
Salida: ya sea un número o una cadena de un solo dígito. Son semánticamente equivalentes. La normalización de cadenas costaría 8 caracteres.
Tres personajes más pueden salvarse si asumimos que el orden de los números dados por la persona que llama - cambiar la expresión regular en la L5 a
/^285$/
o/^258$/
dependiendo del orden producido a partir del juego(opponent)5-(ai)2-(opponent)8
.fuente
5
al inicio de su orden de preferencia.GolfScript (
90 8584 caracteres)Esto toma un enfoque completamente diferente, pero es potencialmente susceptible a optimizaciones para vencer al heurístico. Aquí hacemos un análisis completo del árbol del juego, increíblemente lento. (No, lo digo en serio. Lleva varias horas ejecutar la prueba completa, principalmente debido a
`{...}+
que agrega el estado actual al siguiente ciclo de movimiento). Tenga en cuenta que la parte difícil es identificar un estado ganador (un tercio del código, en la actualidad).Hay algunos trucos feos en las secciones no recursivas. En particular, cuando la posición se identifica como perdedora, tomamos nuestras posiciones como la
[value move]
matriz, confiando en que el movimiento sea irrelevante y el valor sea distinto de cero.fuente