Sortowanie nie ma sensu w przypadku dwuwymiarowej tablicy ... czy to prawda?
Twoim zadaniem jest wziąć siatkę wejściową i zastosować do niej algorytm sortowania bąbelkowego, aż wszystkie wartości w siatce nie będą się zmniejszały od lewej do prawej i od góry do dołu wzdłuż każdego wiersza i kolumny.
Algorytm działa w następujący sposób:
- Każde przejście przechodzi rząd po rzędzie, od góry do dołu, porównując / zamieniając każdą komórkę z jej prawym i poniżej sąsiadów.
- jeśli komórka jest większa niż tylko jedna z jej prawej i poniżej sąsiadów, zamień na komórkę, która jest większa niż
- jeśli komórka jest większa niż jej prawa i poniżej sąsiadów, zamień na mniejszego sąsiada
- jeśli komórka jest większa niż jej prawa i dolna część sąsiadów, które mają tę samą wartość, zamień z dolnym sąsiadem.
- jeśli komórka nie jest większa niż którykolwiek z jej prawych i znajdujących się poniżej sąsiadów, nie rób nic
- Kontynuuj to, dopóki nie zostaną wykonane żadne zamiany podczas całego przejścia. Nastąpi to, gdy każdy wiersz i kolumna będą w porządku, od lewej do prawej i od góry do dołu.
Przykład
4 2 1
3 3 5
7 2 1
Pierwszy rząd przepustki zamieni 4 i 2, a następnie 4 z 1.
2 1 4
3 3 5
7 2 1
Kiedy otrzymamy środkową 3, zostanie ona zamieniona na 2 poniżej
2 1 4
3 2 5
7 3 1
Następnie 5 zostaje zamienionych na 1 poniżej
2 1 4
3 2 1
7 3 5
Ostatni rząd pierwszego przejścia przesuwa 7 do końca w prawo
2 1 4
3 2 1
3 5 7
Następnie wracamy do górnego rzędu
1 2 1
3 2 4
3 5 7
I kontynuuj rząd po rzędzie ...
1 2 1
2 3 4
3 5 7
... dopóki siatka nie zostanie „posortowana”
1 1 2
2 3 4
3 5 7
Inny przykład
3 1 1
1 1 1
1 8 9
staje się
1 1 1
1 1 1
3 8 9
zamiast
1 1 1
1 1 3
1 8 9
ponieważ zamiana w dół ma pierwszeństwo, gdy zarówno prawa, jak i niższa sąsiada komórki są równe.
Implementację referencji krok po kroku można znaleźć tutaj .
Przypadki testowe
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
staje się
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
staje się
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
Zasady
- Możesz wziąć siatkę wejściową w dowolnym dogodnym formacie
- Możesz założyć, że wszystkie wartości liczbowe są liczbami całkowitymi nieujemnymi w 16-bitowym zakresie bez znaku (0–65535).
- Możesz założyć, że siatka jest idealnym prostokątem, a nie poszarpaną tablicą. Siatka będzie wynosić co najmniej 2x2.
- Jeśli użyjesz innego algorytmu sortowania, musisz dostarczyć dowód, że zawsze będzie generował to samo zamówienie wynikowe, jak ta konkretna marka sortowania bąbelkowego 2D, bez względu na to, co jest wprowadzane. Spodziewam się, że będzie to nietrywialny dowód, więc prawdopodobnie lepiej będzie użyć opisanego algorytmu.
Wesołego golfa!
Odpowiedzi:
JavaScript (Node.js) , 129 bajtów
Wypróbuj online!
źródło
APL (Dyalog Unicode) , 75 bajtów SBCS
Dzięki @ Adám za zapisanie 11 bajtów.
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 183 bajty
Wypróbuj online!
Nie jestem ekspertem od matematyki, jestem pewien, że można to zrobić krócej. Szczególnie uważam, że podwójne wyrażenie if można skrócić,
Transpose
ale nie wiem jak.źródło
R ,
169165144132 bajtówWypróbuj online!
źródło
Czysty , 240 bajtów
Wypróbuj online!
Implementuje algorytm dokładnie tak, jak opisano.
Link zawiera parsowanie danych wejściowych w celu pobrania formatu z pytania.
źródło
Python 2 ,
215208 bajtówWypróbuj online!
-7 bajtów, dzięki ovs
źródło
C # (.NET Core) , 310 bajtów
Bez LINQ. Wykorzystuje System.Collections.Generic tylko do formatowania danych wyjściowych po zwróceniu funkcji. To jest głupie ogromne. Czekamy na golfa!
Wypróbuj online!
źródło
Python 2 , 198 bajtów
Wypróbuj online!
Opracowany niezależnie od odpowiedzi TFeld, ma pewne różnice.
źródło
Węgiel drzewny , 118 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wydałem też kilka bajtów na ładniejsze formatowanie. Wyjaśnienie:
JavaScript ma wygodną właściwość, która
a[i]>a[i+1]
jest fałszem, jeślii
jest ostatnim elementem tablicy. Aby naśladować to w Charcoal, obliczamnan
, rzucając,9.e999
by unosić się, a następnie odejmując go od siebie. (Węgiel drzewny nie obsługuje wykładniczych stałych zmiennoprzecinkowych.) Następnienan
uzupełniam pierwotną tablicę po prawej stronie za pomocą, a także dodaję dodatkowy wiersz zawierający tylkonan
. (Cykliczne indeksowanie węgla drzewnego oznacza, że potrzebuję tylko jednego elementu w tym wierszu).Pętla dla każdego elementu w tablicy. To powinno być więcej niż wystarczająca liczba pętli, aby wykonać zadanie, ponieważ uwzględniam także wszystkie dodatkowe
nan
s.Zapętlaj indeks każdego wiersza i uzyskaj wiersz o tym indeksie. (Węgiel drzewny może robić zarówno z wyrażeniem, ale nie z poleceniem.) Obejmuje to atrapę, ale nie stanowi to problemu, ponieważ wszystkie porównania zakończą się niepowodzeniem.
Pętla nad indeksem każdej kolumny i uzyskaj wartość tego indeksu. Ponownie spowoduje to zapętlenie wartości manekina, ale porównania znów się nie powiodą.
Uzyskaj także wartości po prawej i poniżej.
Jeśli komórka jest większa niż wartość poniżej i nie jest prawdą, że wartość poniżej jest większa niż wartość po prawej, zamień komórkę na wartość poniżej.
W przeciwnym razie, jeśli komórka jest większa niż wartość po prawej, zamień je.
Usuń
nan
wartości i sformatuj tablicę pod kątem niejawnego wyniku.źródło
Kotlin , 325 bajtów
Wypróbuj online!
źródło