Introdução
Você é um biólogo que estuda os padrões de movimento das bactérias. Sua equipe de pesquisa tem vários deles em uma placa de Petri e você está registrando a atividade deles. Infelizmente, você está seriamente subfinanciado e não pode pagar por uma câmera de vídeo; portanto, basta tirar uma foto do prato em intervalos regulares. Sua tarefa é criar um programa que rastreie os movimentos dos germes a partir dessas figuras.
Entrada
Suas entradas são duas matrizes 2D de caracteres em qualquer formato razoável, representando imagens consecutivas da placa de Petri. Nas duas matrizes, o caractere .
representa espaço vazio e O
representa um germe (você pode escolher dois caracteres distintos, se desejar). Além disso, a matriz "depois" é obtida da matriz "antes" movendo alguns germes um passo em uma das quatro direções cardinais; em particular, as matrizes têm a mesma forma. Os germes se movem simultaneamente, portanto, um deles pode se mover para um espaço que já continha outro germe, se sair do caminho. É garantido que as bordas da matriz "before" contenham apenas espaços vazios e que haja pelo menos um germe. Assim, o seguinte é um par válido de entradas:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Saída
Sua saída é uma única matriz 2D de caracteres no mesmo formato que as entradas. É obtido da matriz "before" substituindo os germes que foram movidos por um dos >^<v
, dependendo da direção do movimento (você também pode usar 4 caracteres distintos aqui). Pode haver várias saídas possíveis, mas você deve fornecer apenas uma delas. No exemplo acima, uma saída correta possível é
......
.v..O.
.>v.O.
......
Movimento desnecessário é permitido na saída e germes podem trocar de lugar, portanto o seguinte também é válido:
......
.v..v.
.>v.^.
......
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Estou interessado em algoritmos relativamente eficientes, mas não quero banir totalmente a força bruta. Por esse motivo, há um bônus de -75% para resolver o último caso de teste em 10 minutos em uma CPU moderna (não consigo testar a maioria das soluções, por isso confio em você aqui). Isenção de responsabilidade: eu sei que existe um algoritmo rápido (procure por "problema de caminhos disjuntos"), mas não o implementei.
Casos de teste adicionais
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 um movimento de exatamente um passo na respectiva direção.