Este es el segundo de una serie de desafíos de Island Golf. Desafío anterior
Dos ermitaños han llegado a una isla desierta. Como vinieron buscando la soledad, desean vivir lo más lejos posible el uno del otro. ¿Dónde deberían construir sus cabañas para maximizar la distancia a pie entre ellos?
Entrada
Su entrada será una cuadrícula rectangular que consta de dos caracteres, que representan tierra y agua. En los ejemplos a continuación, la tierra es #
y el agua es .
, pero puede sustituir los dos caracteres distintos que desee.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Siempre habrá al menos dos fichas de tierra. Todas las fichas de tierra serán contiguas (es decir, solo hay una isla). Las baldosas de agua también serán contiguas (es decir, no hay lagos). El borde exterior de la cuadrícula será de baldosas de agua. Las fichas de tierra no se conectarán en diagonal: es decir, nunca verás algo como
....
.#..
..#.
....
Salida
Su código debe generar la misma cuadrícula, con dos ubicaciones de cabaña marcadas en ella. En los ejemplos a continuación, las ubicaciones de la cabaña están marcadas con una X, pero puede sustituir cualquier carácter siempre que sea distinto de sus caracteres de tierra y agua.
Las ubicaciones de la cabaña deben ser dos baldosas terrestres, elegidas para maximizar la distancia a pie entre ellas. Definimos la distancia a pie como la longitud del camino más corto, enteramente en tierra, entre los dos puntos. Las baldosas terrestres se consideran adyacentes horizontal o verticalmente, pero no diagonalmente.
Una posible solución para la isla anterior:
...........
...X#......
..#####....
..#######..
.#########.
...#######.
...#####.X.
....####...
...........
La distancia a pie entre estos dos puntos es 11, que es la mayor distancia entre dos puntos en esta isla. Hay otra solución de distancia 11:
...........
...##......
..X####....
..#######..
.#########.
...#######.
...#####.X.
....####...
...........
Detalles
Su solución puede ser un programa completo o una función . Cualquiera de los métodos de entrada y salida predeterminados son aceptables.
Su entrada y salida puede ser una cadena multilínea, una lista de cadenas o una matriz 2D / lista anidada de caracteres / cadenas de un solo carácter. Su salida puede (opcionalmente) tener una nueva línea final. Como se mencionó anteriormente, puede usar tres caracteres distintos en lugar de #.X
(especifique en su envío qué caracteres está usando).
Casos de prueba
A. Islas con ubicaciones únicas en cabañas:
....
.##.
....
....
.XX.
....
......
......
..##..
...#..
......
......
......
......
..X#..
...X..
......
......
........
.#####..
.##..##.
.#..###.
.##..##.
........
........
.#####..
.##..##.
.#..###.
.#X..#X.
........
.........
.#####.#.
.#...#.#.
.#.###.#.
.#.....#.
.#######.
.........
.........
.#####.X.
.#...#.#.
.#.X##.#.
.#.....#.
.#######.
.........
B. Ejemplo de una isla con múltiples soluciones posibles:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Salidas posibles:
........
....#X..
...####.
..###...
.#####..
.X####..
..##....
........
........
....#X..
...####.
..###...
.#####..
.#####..
..X#....
........
........
....##..
...###X.
..###...
.#####..
.X####..
..##....
........
........
....##..
...###X.
..###...
.#####..
.#####..
..X#....
........
C. Gran caso de prueba como Gist
Este es el código de golf : gana el código más corto en cada idioma.
Respuestas:
Python 3,
249246 bytesAfeitado de 3 bytes, gracias DLosc.
La entrada y la salida son cadenas simples, con '.', '@' Y 'X' que representan agua, cabañas y tierra, respectivamente.
Versión anterior:
La entrada es una sola cadena, con '.' y '#' representando agua y tierra, respectivamente. 'X' representa las cabañas en la salida.
Explicación:
Básicamente se trata de una primera búsqueda amplia desde todos los puntos de partida posibles al mismo tiempo. Mantenga un diccionario, d, de las longitudes de ruta marcadas por el inicio y el final de la ruta, por ejemplo, d [(k, i)] es la distancia de k a i. Luego itere sobre las teclas en el diccionario, d, y cree un nuevo diccionario, u, con caminos que sean 1 unidad más largos moviendo el punto final 1 unidad a N, S, E, W, por ejemplo, u [(k, i + 1)] = d [(k, i)] + 1. No incluya rutas que ya están en d. Si u no está vacío, agregue las nuevas rutas más largas a d y repita. Cuando u está vacío, eso significa que no se pueden hacer más caminos. Ahora d contiene todos los caminos posibles y sus longitudes. Entonces es solo cuestión de obtener la clave con el camino más largo.
Versión menos comentada y comentada:
fuente
C #, 387 bytes
Hagamos rodar la pelota ...
Pruébalo en línea
Programa completo, lee de STDIN, escribe en STDOUT. Simplemente pasa por cada celda y ejecuta un BFS para calcular la celda más lejana, registrando ambas si es la más lejana registrada. Nada realmente, y frustrantemente poco que puedo encontrar para jugar golf.
Código formateado y comentado:
fuente