introduction
Vous êtes un biologiste qui étudie les schémas de mouvement des bactéries. Votre équipe de recherche en a un tas dans une boîte de Pétri, et vous enregistrez leur activité. Malheureusement, vous êtes sérieusement sous-financé et vous ne pouvez pas vous permettre une caméra vidéo, vous prenez donc simplement une photo du plat à intervalles réguliers. Votre tâche consiste à créer un programme qui retrace les mouvements des germes à partir de ces images.
Contribution
Vos entrées sont deux tableaux 2D de caractères dans n'importe quel format raisonnable, représentant des images consécutives de la boîte de Pétri. Dans les deux tableaux, le personnage .
représente un espace vide et O
représente un germe (vous pouvez choisir deux caractères distincts si vous le souhaitez). En outre, le tableau "après" est obtenu à partir du tableau "avant" en déplaçant certains germes d'un pas dans l'une des quatre directions cardinales; en particulier, les tableaux ont la même forme. Les germes se déplacent simultanément, de sorte que l'un d'eux peut se déplacer vers un espace qui contenait déjà un autre germe, s'il s'éloigne. Il est garanti que les bordures du tableau "avant" ne contiennent que des espaces vides et qu'il y a au moins un germe. Ainsi, ce qui suit est une paire d'entrées valide:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Production
Votre sortie est un seul tableau 2D de caractères dans le même format que les entrées. Il est obtenu à partir du tableau «avant» en remplaçant les germes qui se sont déplacés par l'un des >^<v
, selon la direction du mouvement (vous pouvez également utiliser 4 caractères distincts ici). Il peut y avoir plusieurs sorties possibles, mais vous ne devez en donner qu'une seule. Dans l'exemple ci-dessus, une sortie correcte possible est
......
.v..O.
.>v.O.
......
Les mouvements inutiles sont autorisés dans la sortie et les germes peuvent changer de place, ce qui suit est également valide:
......
.v..v.
.>v.^.
......
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Je suis intéressé par des algorithmes relativement efficaces, mais je ne veux pas interdire complètement le forçage brut. Pour cette raison, il y a un bonus de -75% pour résoudre le dernier cas de test dans les 10 minutes sur un processeur moderne (je ne peux pas tester la plupart des solutions, donc je vais juste vous faire confiance ici). Avertissement: je sais qu'il existe un algorithme rapide (recherche de "problème de chemins disjoints"), mais je ne l'ai pas implémenté moi-même.
Cas de test supplémentaires
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
correspond à un mouvement d'exactement un pas dans la direction respective.