Introducción
Durante muchos siglos, ha habido un cierto río que nunca ha sido mapeado. El Gremio de Cartógrafos quiere producir un mapa del río, sin embargo, nunca han logrado tener éxito; por alguna razón, todos los cartógrafos que han enviado para mapear el río han sido comidos por animales salvajes en el área. Se requiere un enfoque diferente.
Descripción de entrada
El área es una cuadrícula rectangular de celdas de largo m
y ancho n
. La celda en la parte inferior izquierda sería 0,0
, y la celda en la parte superior derecha sería m-1,n-1
. m
y n
se proporcionan en la entrada como una tupla m,n
.
Mediante el uso de técnicas de sondeo geográfico a larga distancia, se ha identificado la ubicación de las islas alrededor del río. También se ha identificado el tamaño de las islas (es decir, cuántas células ocupa la isla), pero la forma no. Proporcionamos esta información en una tupla s,x,y
donde s
está el tamaño de la isla, x
y y
son las posiciones x e y de una celda particular de esa isla. Cada tupla en la entrada está separada por espacios, así que aquí hay una entrada de ejemplo:
7,7 2,0,0 2,3,1 2,6,1 2,4,3 2,2,4 8,0,6 1,2,6 3,4,6
Para ilustrar más claramente, aquí está la entrada en un gráfico:
y 6|8 1 3
5|
4| 2
3| 2
2|
1| 2 2
0|2
=======
0123456
x
Descripción de salida
Imprima un mapa utilizando caracteres ASCII para representar partes del área. Cada celda será #
(tierra) o .
(agua). El mapa debe seguir estas reglas:
- Definición. Una isla es un grupo ortogonalmente contiguo de celdas terrestres que está delimitado en su totalidad por celdas fluviales y / o el borde del área.
- Definición. Un río es un grupo ortogonalmente contiguo de celdas de agua que está limitado completamente por celdas terrestres y / o el borde del área, y no contiene "lagos" (2x2 áreas de celdas de agua).
- Gobernar . El mapa debe contener exactamente un río.
- Gobernar . Cada celda numerada en la entrada será parte de una isla que contiene exactamente
s
celdas. - Gobernar . Cada isla en el mapa debe contener exactamente una de las celdas numeradas en la entrada.
- Gobernar . Existe un único mapa único para cada entrada.
Aquí está la salida de la entrada de ejemplo:
#.#.##.
#....#.
#.##...
##..##.
###....
...##.#
##....#
Aquí hay otra entrada y salida.
Entrada:
5,5 3,0,1 1,4,1 2,0,4 2,2,4 2,4,4
Salida:
#.#.#
#.#.#
.....
###.#
.....
fuente
javascript:(_=>{var t=Game.nurikabe().task,m=t.length,n=t[0].length,s=[m,n];for(var i=0;i<m;i++)for(var j=0;j<n;j++)if(t[i][j]>=0)s+=' '+[t[i][j],i,j];puzzleContainerDiv.insertAdjacentHTML('beforeend','<hr><tt style=color:red>'+s+'</tt><hr>')})();void(0)
Respuestas:
C + Picosat ,
2345995952 bytesPruébalo en línea!
(Advertencia: este enlace TIO es una URL de 30 kilobytes que contiene una copia reducida de PicoSAT 965, por lo que es posible que no pueda cargarlo en algunos navegadores, pero se carga al menos en Firefox y Chrome).
Cómo funciona
Inicializamos el solucionador SAT con una variable para cada celda (tierra o agua), y solo las siguientes restricciones:
El resto de las restricciones son difíciles de codificar directamente en SAT, por lo que ejecutamos el solucionador para obtener un modelo, ejecutamos una secuencia de búsquedas de profundidad para encontrar las regiones conectadas de este modelo y agregamos restricciones adicionales de la siguiente manera:
Aprovechando la interfaz incremental para la biblioteca PicoSAT, podemos volver a ejecutar inmediatamente el solucionador, incluidas las restricciones agregadas, conservando todas las inferencias anteriores realizadas por el solucionador. PicoSAT nos ofrece un nuevo modelo, y continuamos iterando los pasos anteriores hasta que la solución sea válida.
Esto es notablemente efectivo; resuelve 15 × 15 y 20 × 20 instancias en una pequeña fracción de segundo.
(Gracias a Lopsy por sugerir esta idea de restringir interactivamente las regiones conectadas en un solucionador SAT incremental, hace un tiempo).
Algunos casos de prueba más grandes de puzzle-nurikabe.com
Una página aleatoria de 15 × 15 rompecabezas duros ( 5057541 , 5122197 , 5383030 , 6275294 , 6646970 , 6944232 ):
Una página aleatoria de 20 × 20 rompecabezas normales ( 536628 , 3757659 ):
fuente
GLPK , (no competidor) 2197 bytes
Esta es una entrada no competitiva, ya que
Guardaré una versión aún sin golf, pero funcional aquí. Dependiendo de los comentarios, podría intentar acortarlo + agregar una explicación si hay interés. Hasta ahora, los nombres de restricción sirven como documentos in situ.
La idea principal es codificar la restricción de "islas contiguas" mediante la introducción de una variable de flujo conservado que tenga una fuente preespecificada en la ubicación de la pista. La variable de decisión
is_island
juega el papel de sumideros colocables. Al minimizar la suma total de este flujo, las islas se ven obligadas a permanecer conectadas de manera óptima. Las otras restricciones implementan bastante directamente las diversas reglas. Lo que me desconcierta que todavía parece necesitarisland_fields_have_at_least_one_neighbor
.Sin embargo, el rendimiento de esta formulación no es excelente. Al comer directamente toda la complejidad con una gran cantidad de restricciones, el solucionador tarda cerca de 15 segundos para el ejemplo de 15 x 15.
Código (aún sin golf)
Datos del problema
5 x 5
7 x 7
15 x 15
Uso
Tener
glpsol
instalado, modelar como un archivo (por ejemploriver.mod
), ingresar datos en archivos separados (por ejemplo7x7.mod
). Luego:Esto más un poco de paciencia imprimirá la solución en el formato de salida especificado (junto con "algunos" resultados de diagnóstico).
fuente
Python 3 , 1295 bytes
Esta es una solución única para Python. No utiliza bibliotecas y carga la placa a través de la entrada estándar. Más explicaciones por venir. Este es mi primer intento en un golf tan grande. Hay un enlace al código comentado y sin golf en la parte inferior.
Pruébalo en línea!
Mira el código sin golf .
fuente