Chomp es un juego de dos jugadores con una configuración de un rectángulo de piezas. Cada jugador toma un turno para eliminar cualquier pieza, junto con todas las piezas que se encuentran arriba y a su derecha. Quien tome la pieza inferior izquierda pierde. Se puede demostrar con bastante facilidad que el primer jugador siempre tiene un movimiento ganador (excepto con un rectángulo de 1 por 1); Encuéntralo.
- La entrada es las dimensiones del rectángulo (dos números)
- La salida es la ubicación del movimiento ganador (dos números)
- Si hay más de un movimiento ganador, entonces puedes sacar cualquiera de ellos.
Este es el código de golf; el código más corto (cualquier idioma) gana.
Ejemplos
Nota: Las salidas son solo los dos números; El siguiente arte ASCII es solo para demostrar lo que significan los números.
Entrada: 5 3 (índices basados en 1 a partir de la esquina inferior izquierda)
Salida: 4 3
XXX--
XXXXX
XXXXX
Entrada: 4 4
Salida: 2 2
X---
X---
X---
XXXX
Prima
Resta 15 personajes de tu puntuación si sacas todos los movimientos ganadores. Cada par de números debe estar separado por una nueva línea.
Respuestas:
GolfScript, 82 (
10897 caracteres - 15 bonus)Como no conocía ninguna heurística, esta solución realiza una búsqueda exhaustiva en el espacio de la solución. Puede probar el código en línea . Aunque la implementación es muy eficiente, el espacio de búsqueda crece muy rápido al aumentar la entrada.
Ejemplos:
Como se mencionó anteriormente, la implementación no se basa en la recursividad, sino que visita cada nodo del espacio de búsqueda solo una vez. A continuación puede encontrar una versión anotada del código que describe los bloques de construcción con más detalle.
La representación de una sola placa de tamaño w * h viene dada por una lista de números w en el rango de 0 a h . Cada número da la cantidad de piezas en la columna correspondiente. Por lo tanto, una configuración válida es una lista donde los números no aumentan de principio a fin (con cualquier movimiento, se asegura de que todas las columnas a la derecha sean tan altas como la elegida).
fuente
Pitón
23, 141-15 = 126Búsqueda minimax de fuerza bruta. Para cada movimiento posible, vemos recursivamente si el oponente puede ganar después de que hacemos ese movimiento. Bastante débilmente golfizado; alguien más debería poder hacerlo mucho mejor. Esto se siente como un trabajo para APL.
win
es la interfaz pública Toma las dimensiones del tablero, lo convierte en una representación del tablero y se lo pasa aw
.w
es el algoritmo minimax Toma un estado de tablero, intenta todos los movimientos, construye una lista cuyos elementos corresponden a movimientos ganadores y devuelve True si la lista está vacía. Con el valor predeterminadof=print
, la creación de la lista tiene el efecto secundario de imprimir los movimientos ganadores. El nombre de la función solía tener más sentido cuando devolvía una lista de movimientos ganadores, pero luego moví elnot
frente de la lista para ahorrar un espacio.for r,p in enumerate(b)for c in xrange(p) if(r+c)
: Iterar sobre todos los movimientos posibles.1 1
se trata como un movimiento no legal, simplificando un poco el caso base.b[:r]+[min(i,c)for i in b[r:]]
: Construye el estado del tablero después del movimiento representado por las coordenadasr
yc
.w(b[:r]+[min(i,c)for i in b[r:]],max)
: Recurse para ver si el nuevo estado es un estado perdedor.max
es la función más corta que pude encontrar que tomaría dos argumentos enteros y no se quejaría.f(r+1,c+1)
: Sif
es imprimir, imprime el movimiento. Sea lo quef
sea, produce un valor para rellenar la longitud de la lista.not [...]
:not
devuelveTrue
para listas vacías yFalse
para no vacías.Código original de Python 2, completamente sin golf, incluida la memorización para manejar entradas mucho más grandes:
Manifestación:
fuente
13x13
toma2x2
y ganarías.Perl 6:
113108caracteres - 15 = 93 puntosEste fue duro! Aquí está la versión en caché, que es técnicamente correcto, pero tomará un muy largo tiempo para las entradas no triviales.
Funciona igual que la implementación de Python de @ user2357112 (¡lo votó , no podría haberlo resuelto sin su trabajo!) Excepto que win () toma un tablero (matriz) de Chomp en lugar de un ancho y una longitud. Se puede usar como:
Una versión con memorización, que en realidad puede manejar entradas decentes (sin embargo, no está optimizada para facilitar la lectura):
fuente