Introducción
Usted es biólogo y estudia los patrones de movimiento de las bacterias. Su equipo de investigación tiene un montón de ellos en una placa de Petri, y usted está registrando su actividad. Desafortunadamente, no tiene fondos suficientes y no puede pagar una cámara de video, por lo que simplemente toma una foto del plato a intervalos regulares. Su tarea es hacer un programa que rastree los movimientos de los gérmenes a partir de estas imágenes.
Entrada
Sus entradas son dos matrices 2D de caracteres en cualquier formato razonable, que representan imágenes consecutivas de la placa de Petri. En ambas matrices, el carácter .
representa un espacio vacío y O
representa un germen (puede elegir dos caracteres distintos si lo desea). Además, la matriz "después" se obtiene de la matriz "antes" moviendo algunos gérmenes un paso en una de las cuatro direcciones cardinales; en particular, las matrices tienen la misma forma. Los gérmenes se mueven simultáneamente, por lo que uno de ellos puede moverse a un espacio que ya contenía otro germen, si se mueve fuera del camino. Se garantiza que los bordes de la matriz "antes" contienen solo espacios vacíos y que hay al menos un germen. Por lo tanto, el siguiente es un par válido de entradas:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Salida
Su salida es una única matriz 2D de caracteres en el mismo formato que las entradas. Se obtiene de la matriz "antes" al reemplazar los gérmenes que se han movido con uno de ellos >^<v
, dependiendo de la dirección del movimiento (también puede usar 4 caracteres distintos aquí). Puede haber varias salidas posibles, pero debe dar solo una de ellas. En el ejemplo anterior, una salida correcta posible es
......
.v..O.
.>v.O.
......
Se permite un movimiento innecesario en la salida y los gérmenes pueden intercambiar lugares, por lo que lo siguiente también es válido:
......
.v..v.
.>v.^.
......
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Estoy interesado en algoritmos relativamente eficientes, pero no quiero prohibir por completo la fuerza bruta. Por esta razón, hay una bonificación del -75% para resolver el último caso de prueba en 10 minutos en una CPU moderna (no puedo probar la mayoría de las soluciones, así que confiaré en ti aquí). Descargo de responsabilidad: sé que existe un algoritmo rápido (buscar "problema de rutas disjuntas"), pero no lo he implementado yo mismo.
Casos de prueba adicionales
Before
......
.O..O.
..OO..
......
After
......
..O...
...OO.
..O...
Possible output
......
.>..v.
..vO..
......
Before
.......
.OOOOO.
.O..OO.
.OO..O.
.OOOOO.
.......
After
.......
..OOOOO
.O...O.
.O...O.
.OOOOOO
....O..
Possible output
.......
.>>>>>.
.O..>v.
.Ov..v.
.O>>v>.
.......
Before
..........
.OOO..OOO.
.OOOOOOOO.
.OOO..OOO.
..........
After
..O.......
.OOO..O.O.
..OOOOOOOO
.O.O..OOO.
.......O..
Possible output
..........
.>^O..O>v.
.^O>>>vO>.
.O>^..>vO.
..........
Before
............
.OO..OOOOOO.
.OO......OO.
...OOOOOO...
.O.OOOOOO.O.
...OOOOOO...
.OOOOOOOOOO.
............
After
..........O.
.OO..OOOOO..
.O...O...O..
.O.OOOOOOO..
.O.OOOOOO..O
...OO..OO...
....OOOOOOOO
.OOO........
Possible output
............
.OO..v<<<<^.
.v<......^<.
...OOO>>>...
.O.OOO^OO.>.
...OOv^OO...
.vvvO>>>>>>.
............
Before
................
.OOOOOO.OOOOOOO.
..OO..OOOOOOOOO.
.OOO..OOOO..OOO.
..OOOOOOOO..OOO.
.OOOOOOOOOOOOOO.
................
After
................
..OOOOO.OOOOOOOO
..OO..OOOOOOOOO.
..OO..OOOO..OOOO
..OOOOOOOO..OOO.
..OOOOOOOOOOOOOO
................
Possible output
................
.>>>>>v.>>>>>>>.
..OO..>>^>>>>>v.
.>>v..OOO^..OO>.
..O>>>>>>^..OOO.
.>>>>>>>>>>>>>>.
................
Before
..............................
.OOO.O.O.....O.....O.O.O..O...
..OOO.O...O..OO..O..O.O.......
.....O......O..O.....O....O...
.O.OOOOO......O...O..O....O...
.OO..O..OO.O..OO..O..O....O...
..O.O.O......OO.OO..O..OO.....
..O....O..O.OO...OOO.OOO...O..
.....O..OO......O..O...OO.OO..
........O..O........OO.O.O....
..O.....OO.....OO.OO.......O..
.O.....O.O..OO.OO....O......O.
..O..OOOO..O....OO..........O.
.O..O...O.O....O..O....O...OO.
....O...OO..O.......O.O..OO...
........O.O....O.O....O.......
.OO.......O.OO..O.......O..O..
....O....O.O.O...OOO..O.O.OO..
.OO..OO...O.O.O.O.O...OO...O..
..............................
After
..............................
.OOOOO.......OO.....O..O......
...OO..O...O...O....OO....O...
....O.O......O..OO...OO...O...
.OO.OOOO......OO..O..O........
O.O.OO..O..O..O..OO...O...OO..
.OO.....O....OO.O..O.OO.O.....
......O.....O.....OOO.OO...O..
....O..OOOO..O..O..O.O.O.OO...
..O......O.O........O...O.O...
.O.....OOO.....OO.OO...O...O..
.......OOO..O.O.O...........O.
.O...O.....O...OOOO..O.O....O.
.O..O.O..O.....O......O....OO.
....O..O..O.O......O.....O....
........OOO....O......O..O....
.OO......O..OO..OOO.....O..O..
..O.O....OO..O...OO...O...OO..
.O..OO....O..O...O.O.O.OO.....
..............O............O..
Possible output
..............................
.OOO.O.v.....>.....>.v.O..v...
..>>^.v...>..^>..v..O.v.......
.....<......>..>.....O....O...
.O.<O><O......O...O..O....v...
.<O..O..v<.O..O^..O..>....>...
..<.^.v......OO.O^..>..<O.....
..^....v..v.Ov...>>^.<OO...O..
.....<..OO......O..O...Ov.v<..
........>..O........O^.v.^....
..^.....Ov.....OO.OO.......O..
.^.....^.^..O>.vO....v......O.
..<..Ov^^..O....><..........O.
.O..O...>.v....O..^....^...OO.
....O...<v..O.......<.^..v<...
........O.O....O.v....O.......
.OO.......<.Ov..O.......O..O..
....O....O.<.^...O^v..O.v.OO..
.O^..<<...O.>.v.>.^...<O...v..
..............................
>^<v
corresponde a un movimiento de exactamente un paso en la dirección respectiva.