Einführung
Sie sind Biologe und untersuchen die Bewegungsmuster von Bakterien. Ihr Forschungsteam hat ein paar davon in einer Petrischale und Sie zeichnen deren Aktivität auf. Leider sind Sie stark unterfinanziert und können sich keine Videokamera leisten. Machen Sie daher in regelmäßigen Abständen ein Foto des Gerichts. Ihre Aufgabe ist es, ein Programm zu erstellen, das die Bewegungen der Keime aus diesen Bildern nachzeichnet.
Eingang
Ihre Eingaben sind zwei 2D-Zeichenfelder in jedem vernünftigen Format, die aufeinanderfolgende Bilder der Petrischale darstellen. In beiden Arrays stellt das Zeichen ein .
Leerzeichen und O
einen Keim dar (Sie können zwei beliebige Zeichen auswählen, wenn Sie möchten). Außerdem wird das "After" -Array aus dem "Before" -Array erhalten, indem einige Keime um einen Schritt in eine der vier Hauptrichtungen bewegt werden. Insbesondere haben die Arrays die gleiche Form. Die Keime bewegen sich gleichzeitig, sodass sich einer von ihnen in ein Feld bewegen kann, das bereits einen anderen Keim enthielt, wenn er aus dem Weg geht. Es wird garantiert, dass die Ränder des "Vorher" -Arrays nur Leerzeichen enthalten und dass es mindestens einen Keim gibt. Das Folgende ist also ein gültiges Eingangspaar:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Ausgabe
Ihre Ausgabe ist ein einzelnes 2D-Array von Zeichen im selben Format wie die Eingaben. Es wird aus dem "Vorher" -Array erhalten, indem die bewegten Keime >^<v
je nach Bewegungsrichtung durch eines der folgenden ersetzt werden (Sie können hier auch 4 verschiedene Zeichen verwenden). Es kann mehrere mögliche Ausgaben geben, aber Sie sollten nur eine davon angeben. Im obigen Beispiel ist eine mögliche korrekte Ausgabe
......
.v..O.
.>v.O.
......
Unnötige Bewegung ist in der Ausgabe erlaubt und Keime können Plätze tauschen, so dass auch Folgendes gilt:
......
.v..v.
.>v.^.
......
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Ich bin an relativ effizienten Algorithmen interessiert, aber ich möchte das Brute Forcing nicht ganz verbieten. Aus diesem Grund gibt es einen Bonus von -75% für die Lösung des letzten Testfalls innerhalb von 10 Minuten auf einer modernen CPU (ich kann die meisten Lösungen nicht testen, daher vertraue ich Ihnen hier nur). Haftungsausschluss: Ich weiß, dass ein schneller Algorithmus existiert (Suche nach "Disjoint Paths Problem"), habe ihn aber nicht selbst implementiert.
Zusätzliche Testfälle
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
entspricht einer Bewegung von genau einem Schritt in die jeweilige Richtung.