Вступление
Вы биолог, изучающий закономерности движения бактерий. У вашей исследовательской группы их куча в чашке Петри, а вы записываете их активность. К сожалению, вы серьезно недофинансированы и не можете позволить себе видеокамеру, поэтому вы просто фотографируете блюдо через равные промежутки времени. Ваша задача - составить программу, которая отслеживает движения микробов по этим картинкам.
вход
Ваши входные данные представляют собой два двумерных массива символов в любом приемлемом формате, представляющих последовательные изображения чашки Петри. В обоих массивах символ .
представляет собой пустое пространство и O
представляет собой зародыш (вы можете выбрать любые два различных символа, если хотите). Кроме того, массив «после» получается из массива «до» путем перемещения некоторых микробов на один шаг в одном из четырех основных направлений; в частности, массивы имеют одинаковую форму. Микробы движутся одновременно, поэтому один из них может переместиться в пространство, в котором уже содержится другой микроб, если он уходит с дороги. Гарантируется, что границы массива «before» содержат только пустые пробелы и что есть хотя бы один зародыш. Таким образом, следующее является допустимой парой входных данных:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Выход
Ваш вывод представляет собой один двумерный массив символов в том же формате, что и входные данные. Он получается из массива «before» путем замены тех микробов, которые переместились, на один из >^<v
, в зависимости от направления движения (вы также можете использовать любые 4 различных символа здесь). Возможных выходов может быть несколько, но вы должны указать только один из них. В приведенном выше примере одним из возможных правильных выходных данных является
......
.v..O.
.>v.O.
......
В выходных данных допускается ненужное перемещение, и микробы могут поменяться местами, поэтому действует также следующее:
......
.v..v.
.>v.^.
......
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Мне интересны относительно эффективные алгоритмы, но я не хочу полностью запрещать грубое принуждение. По этой причине есть бонус -75% за решение последнего теста в течение 10 минут на современном процессоре (я не могу тестировать большинство решений, поэтому я просто доверю вам здесь). Отказ от ответственности: я знаю, что существует быстрый алгоритм (поиск «проблема непересекающихся путей»), но я сам не реализовал его.
Дополнительные тестовые случаи
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
соответствует движению ровно на один шаг в соответствующем направлении.