Visión general
Perlas (o Masyu) es un juego de lógica jugado en una cuadrícula. Hay perlas blancas y negras colocadas en la cuadrícula. El objetivo es formar un solo bucle cerrado que viaje a través de cada perla usando solo segmentos de línea recta y ángulos rectos.
Hay algunas reglas que rigen cómo interactúa el bucle con las perlas:
- Las perlas blancas deben viajar directamente , pero el bucle debe girar en la celda anterior y / o siguiente en su camino.
- Las perlas negras deben estar activadas , pero el bucle debe viajar directamente a través de las celdas siguientes y anteriores en su camino.
- El bucle no debe cruzarse ni cruzarse de otro modo. Todas las celdas tienen exactamente cero o dos entradas / salidas de bucle.
Un ejemplo de rompecabezas de Wikipedia (y su solución):
Tu objetivo es resolver un rompecabezas dado. Si hay varias soluciones posibles, no importa cuál le dé.
Entrada
La entrada será una cuadrícula cuadrada sin resolver . El ejemplo que se muestra arriba se vería así:
..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b
w
es una perla blanca, b
es una perla negra y .
es una celda vacía.
Suponga que la entrada es válida. Esto significa que está bien formado y que al menos una solución es posible. Todos los rompecabezas válidos son al menos 3x3, y contienen al menos una perla.
Salida
La salida es una cadena de coordenadas que representa la ruta. La esquina superior izquierda de la cuadrícula es 0 0
, superior derecha n-1 0
, donde n es el ancho de la cuadrícula.
Una ruta es simplemente una serie de coordenadas ordenadas:
x1 y1 x2 y2 x3 y3 ...
Se supone que la ruta está cerrada, por lo que no necesita repetir la primera coordenada al final, pero no hay penalización por hacerlo.
La salida debe consistir en al menos todas las esquinas de la ruta. No tiene que generar todas las celdas de la ruta si no hay turno. Por ejemplo, la salida para el ejemplo podría comenzar con:
1 0 5 0 5 1 ...
o
1 0 2 0 3 0 4 0 5 0 5 1 ...
La salida no debe contener ninguna celda que no esté en la ruta. Puede comenzar en cualquier celda del camino.
Retazo
Aquí hay un fragmento que puede usar para visualizar su solución. Simplemente pegue la cuadrícula en la que está trabajando y la ruta de salida. Soy consciente de que es doloroso mirar mi código, así que solo sugiero que no lo hagas;)
Casos de prueba
Estos casos de prueba muestran una salida posible para cada entrada (excepto la última, que se muestra sin resolver). Puede haber otras rutas válidas, puede ir hacia la derecha o hacia la izquierda o comenzar en un punto diferente, etc. Las soluciones deben poder resolver los casos de prueba en segundos / minutos / horas, no días / semanas / eones.
...
w..
..b
0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1
.wb..b
......
..b...
w.ww..
......
b....b
0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1
.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..
fuente
Respuestas:
C, 590
640 760 880 963 1018La fuerza bruta es bastante rápida para esto. La prueba 12x12 se ejecuta por debajo de 10 ms. Saber que podría optar por un lenguaje más apropiado para el golf.
No asumo que el tablero es cuadrado ya que los rompecabezas más grandes tienden a no ser cuadrados.
La
W
definición establece el límite en las dimensiones del tablero. El límite real es menorW - 2
ya que uso filas adicionales para los bordes para evitar verificaciones de límites.Ponme a prueba .
Aquí hay un caso de prueba más desafiante:
Tuve suerte de que mi código encuentre la solución bastante temprano en la ejecución (<5 minutos), pero la búsqueda completa lleva mucho más tiempo (67 minutos).
fuente
Python - 1669
Todavía es bastante largo, pero lo suficientemente rápido como para ejecutar el último ejemplo en menos de un segundo en mi computadora. Probablemente sea posible acortar a costa de la velocidad, pero por ahora es más o menos equivalente al código no golfizado.
Ejemplo de salida para el último caso de prueba:
Código:
Sin golf:
fuente
Lua,
830810765752739729710Ejecuta board1 y board2 bien, pero lleva un tiempo en board3.
Podría ahorrar 9 bytes al generar cada ruta en lugar de solo la primera ...
fuente