¡Oh no! Nemo, nuestro pequeño pez payaso se pierde en este océano ASCII y su padre Marlin está tratando de encontrarlo.
Su tarea es llevar a Marlin a Nemo con seguridad. Pero cuidado, tenemos un frenesí de alimentación Bruce suelto, ¡así que mejor evítalo a toda costa!
Detalles
Se le proporciona una cuadrícula oceánica rectangular ASCII que contiene solo alfabetos en minúsculas a-z
. Este océano tendrá nemo
, marlin
y bruce
dentro de él, en forma de un poliomino continuo, siempre comenzando desde la celda más alta en la primera columna de poliomino. Entonces, por ejemplo, de todos los tetrominos posibles, los válidos se enumeran en el fragmento a continuación
Pero formas como estas no son válidas y no estarán presentes en la entrada:
omen
ne
mo
nem
o
o
m
en
nem
o
n
eo
m
Finalmente, su tarea es encontrar una ruta desde el marlin
mosaico poliomino al mosaico nemo
poliomino asegurándose de que ninguna celda en su ruta no sea adyacente al bruce
mosaico poliomino. Su salida debe reemplazar todos los alfabetos que no son parte del marlin
mosaico, el nemo
mosaico y la ruta que los conecta a ambos con un carácter del rango ASCII imprimible (incluido el espacio) que no sea minúscula a-z
.
Ejemplo
Si el océano de entrada es el siguiente:
oxknvvolacycxg
xmliuzsxpdzkpw
warukpyhcldlgu
tucpzymenmoyhk
qnvtbsalyfrlyn
cicjrucejhiaeb
bzqfnfwqtrzqbp
ywvjanjdtzcoyh
xsjeyemojwtyhi
mcefvugvqabqtt
oihfadeihvzakk
pjuicqduvnwscv
(siendo los 3 poliominos:
...n..........
.mli..........
.ar...........
..............
....b.........
....ruce......
..............
.....n........
.....emo......
..............
..............
..............
)
Entonces una solución válida puede verse así:
...n..........
.mli..........
.ar...........
.u............
.n............
.i............
.z............
.wvjan........
.....emo......
..............
..............
..............
El siguiente fragmento contiene algunos ejemplos más:
Notas
- La cuadrícula siempre será un rectángulo perfecto y contendrá solo un mosaico poliomino de
nemo
,marlin
ybruce
. - Su ruta no debe atravesar
bruce
ni ninguna de las 4 celdas adyacentes (arriba, abajo, izquierda y derecha) de ninguna celda en elbruce
mosaico. - Siempre se garantiza que habrá al menos una ruta válida desde
marlin
hastanemo
. - No hay requisito de un camino más corto aquí, ¡así que enloquece!
- Aunque no tiene que encontrar la ruta más corta, ninguna celda en la ruta (ruta que no incluye marlin o nemo) no puede estar adyacente a más de otras dos células en la ruta.
- El camino no debe atravesar las baldosas
marlin
onemo
, ya que confundiría a los pequeños peces al elegir una dirección. - Como de costumbre, puede escribir un programa o función, tomando la entrada a través de STDIN (o equivalente más cercano), argumento de línea de comando o parámetro de función, y produciendo salida a través de STDOUT (o equivalente más cercano), valor de retorno o parámetro de función (out).
- Si no es posible la entrada de varias líneas, puede suponer que la cuadrícula está unida por el
|
carácter en lugar de\n
. También puede tomar la entrada como una matriz de filas de cuadrícula.
Este es el código de golf, por lo que gana la entrada más corta en bytes.
fuente
k
anteriorl
en marlin fuera visible? (haciendo el camino de la n en marlin a nemo)Respuestas:
Matlab 560
560 bytes al eliminar todos los espacios innecesarios, todos los puntos y comas y todos los comentarios. Podría jugar al golf mucho más, pero ahora estoy cansado (tal vez mañana ...) Buenas noches a todos.
PD: Supuse que la ruta debe tener una conexión de 4 vecindades ('+').
Función de llamada: (no se necesitan líneas nuevas)
Salida:
Cómo funciona
Extrayendo nombres
La primera parte es extraer los nombres
nemo
, por ejemplo , lo que hace la funciónq()
. La función primero marca todo como 0, luego ocurre la primera letra del nombre como1
, luego la segunda letra como2
si hubiera una1
en el vecindario, luego la tercera y así sucesivamente. Después de eso, en el caso denemo
ser solo uno4
. A partir de ahí, retrocedemos hasta encontrar el1
nuevo y luego eliminamos todos los otros números que eran mayores que, de modo que obtenemos una bonita máscara dondenemo
se enmascaran las letras . Hacemos esto para los tres nombres, y luego podemos proceder a encontrar una ruta.Encontrar el camino
Comenzamos en las posiciones de Marlins y enviamos una onda de choque a través de la 'imagen' del agujero paso a paso. En cada paso aumentamos el contador de distancia y marcamos los 'píxeles' debajo del frente de onda con la distancia actual. (Como generalmente se hace con algoritmos de ruta más corta). Este frente de onda obviamente es bloqueado por el área de Bruce, por lo tanto, fluirá a su alrededor. Este paso se repite hasta que se alcanza un límite superior. Este límite superior (ciertamente muy suelto) es ahora la circunferencia de la 'imagen' (los caminos más cortos serán mucho más cortos en cualquier caso). En el caso de prueba se ve así:
Ahora comience en
nemo
píxeles y disminuya el contador de distancia en cada paso y agregue un vecino con la siguiente distancia más baja (de acuerdo con ese mapa de distancia que calculamos anteriormente) a nuestra ruta.fuente
Python 2 - 658
Muy muy ineficiente tanto en tiempo como en memoria. La función para identificar los patrones es la función recursiva S, y la función para encontrar las rutas es la C, que es básicamente una implementación A * horriblemente ineficiente.
Para las pruebas, use este (muy ligeramente) menos golfizado (que calcula la ruta una vez para cada ficha)
fuente