Wyzwanie
Otrzymujesz reprezentację ASCII-art znaków na płaszczyźnie jako dane wejściowe dowolną rozsądną metodą. Będzie to zawierać tylko:
[a-z]
reprezentujących ruchome postacie. Każda litera pojawi się na planszy maksymalnie raz.#
reprezentujące nieruchome ściany.
reprezentujący pustą przestrzeń
Na przykład:
abcdef.gh#..
.......ij.#.
#..#.......#
...#.#...###
.#.......#q#
.........###
Otrzymujesz również ciąg reprezentujący zmiany grawitacji. Będzie to zawierać tylko:
>
reprezentujący zmianę grawitacji w prawo<
reprezentujący zmianę grawitacji w lewo^
reprezentujący zmianę grawitacji w góręv
reprezentujący zmianę grawitacji w dół
Na przykład:
v>^
Twój program musi symulować kolejno każdą zmianę grawitacji, aż wszystkie postacie przestaną się poruszać (uderzą w ścianę lub inną postać). Postacie, które „spadają z krawędzi mapy” są trwale usuwane, a postacie mogą „ustawiać się” jeden na drugim.
W tym przykładzie, na początku jest grawitacyjnie do dołu (w v
), tak, c
, e
, g
, h
, i
, i j
spadają do dolnej części mapy. Wszystkie pozostałe postacie przesuwają się w dół, aż uderzą w ścianę, pozostawiając mapę w ten sposób:
.........#..
a..d......#.
#..#.f.....#
.b.#.#...###
.#.......#q#
.........###
Następnie przechodzimy do grawitacji w prawo ( >
), która pozostawia nam to: Zwróć uwagę na a
stosy obok d
.
.........#..
........ad#.
#..#......f#
..b#.#...###
.#.......#q#
.........###
Wreszcie możemy symulować grawitację w górę ( ^
), w którym a
a b
odpadać mapie.
.........#..
.........d#.
#..#......f#
...#.#...###
.#.......#q#
.........###
Twoim zadaniem jest wyprowadzenie pozostałych postaci po przesunięciu grawitacyjnym. Można je podać w dowolnej kolejności. W tym przykładzie można wyprowadzić dowolną permutacjędfq
.
Przypadki testowe
Dla następującej mapy:
abcde
.....
##.##
v = abde
v> = <nothing>
Dla następującej mapy:
######
#....#
abcdef
#.gh..
######
> = <nothing>
< = gh
^> = bcde
v< = bghef
Odpowiedzi:
JavaScript (ES6),
251233 bajtówEdycja: Zapisano 18 bajtów dzięki @WashingtonGuedes.
Działa poprzez czterokrotne obrócenie siatki wejściowej dla każdego znaku kierunkowego, ale w kierunku, w którym znak kierunkowy pasuje do znaku pętli, wykonujemy lewą grawitację. Pseudo kod:
źródło
JavaScript (ES6), 199
Ten sam algorytm odpowiedzi @ Neil. Siatka jest obracana czterokrotnie dla każdego znaku kierunkowego, gdy we właściwej pozycji przesunięcie grawitacyjne w lewo jest stosowane do każdego rzędu.
źródło
Pyth, 143 bajty
(Czy naprawdę potrzebujemy tyle bajtów?)
Wypróbuj online!
Jak to działa
Definiujemy funkcję,
left
która wykonuje lewą grawitację.Następnie inne kierunki są implementowane przez bałagan z tablicą, tak że pożądany kierunek jest w lewo, a następnie wykonaj
left
.Algorytm
left
jest tutaj:".X"
się"X."
, gdzieX
reprezentuje literę.Cały program jest podzielony na 6 następujących sekcji:
Pierwsza sekcja
Druga sekcja
Trzecia sekcja
Czwarta sekcja
Część piąta
Sekcja szósta
źródło
Rubinowy, 306 bajtów
Funkcja anonimowa. Całkiem okrężna technika, którą prawdopodobnie można zoptymalizować.
źródło