Wprowadzenie
Jesteś biologiem badającym wzorce ruchowe bakterii. Twój zespół badawczy ma ich kilka na szalce Petriego, a ty rejestrujesz ich aktywność. Niestety, jesteś poważnie niedofinansowany i nie możesz sobie pozwolić na kamerę wideo, więc po prostu rób zdjęcia anteny w regularnych odstępach czasu. Twoim zadaniem jest stworzenie programu, który śledzi ruch zarazków z tych zdjęć.
Wkład
Twoje dane wejściowe to dwie tablice 2D znaków w dowolnym rozsądnym formacie, reprezentujące kolejne zdjęcia płytki Petriego. W obu tablicach znak .
reprezentuje pustą przestrzeń i O
reprezentuje zarodek (możesz wybrać dowolne dwa różne znaki, jeśli chcesz). Również tablica „po” jest uzyskiwana z tablicy „przed” poprzez przesunięcie niektórych zarazków o jeden krok w jednym z czterech głównych kierunków; w szczególności tablice mają ten sam kształt. Zarazki poruszają się jednocześnie, więc jeden z nich może przenieść się na przestrzeń, która już zawierała inny zarazek, jeśli zejdzie z drogi. Gwarantuje się, że granice tablicy „przed” zawierają tylko puste spacje i że istnieje co najmniej jeden zarodek. Dlatego następująca poprawna para danych wejściowych:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Wydajność
Twój wynik to pojedyncza tablica 2D znaków w tym samym formacie co dane wejściowe. Uzyskuje się go z tablicy „przed” poprzez zamianę zarazków, które przesunęły się na jedną >^<v
, w zależności od kierunku ruchu (możesz tutaj użyć dowolnych 4 różnych znaków). Może być kilka możliwych wyników, ale powinieneś podać tylko jedno z nich. W powyższym przykładzie jedną z możliwych poprawnych danych wyjściowych jest
......
.v..O.
.>v.O.
......
Na wyjściu dozwolony jest niepotrzebny ruch, a zarazki mogą zamieniać się miejscami, więc obowiązuje również:
......
.v..v.
.>v.^.
......
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Interesują mnie stosunkowo wydajne algorytmy, ale nie chcę całkowicie blokować brutalnego wymuszania. Z tego powodu istnieje premia w wysokości -75% za rozwiązanie ostatniego przypadku testowego w ciągu 10 minut na nowoczesnym procesorze (nie jestem w stanie przetestować większości rozwiązań, więc po prostu wam tutaj ufam). Oświadczenie: Wiem, że istnieje szybki algorytm (wyszukaj „problem z rozłącznymi ścieżkami”), ale sam go nie wdrożyłem.
Dodatkowe przypadki testowe
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
odpowiada ruchowi dokładnie jednego kroku w odpowiednim kierunku.