Sortieren macht für ein zweidimensionales Array keinen Sinn ... oder doch?
Ihre Aufgabe ist es, ein Eingabegitter zu nehmen und einen Algorithmus anzuwenden, der einer Blasensortierung ähnelt, bis alle Werte im Gitter in jeder Zeile und Spalte nicht mehr von links nach rechts und von oben nach unten abnehmen.
Der Algorithmus funktioniert wie folgt:
- Jeder Durchgang erfolgt zeilenweise von oben nach unten, wobei jede Zelle mit ihren rechten und unteren Nachbarn verglichen / ausgetauscht wird.
- Ist die Zelle größer als nur eine ihrer rechten und unteren Nachbarn, tauschen Sie sie gegen diejenige aus, die größer als ist
- Ist die Zelle größer als die rechte und die untere Nachbarzelle, tauschen Sie sie mit dem kleineren Nachbarn aus
- Wenn die Zelle größer ist als ihre rechten und unteren Nachbarn, die den gleichen Wert haben, tauschen Sie sie mit dem unteren Nachbarn aus.
- Wenn die Zelle nicht größer als eine der rechten und unteren Nachbarn ist, nichts tun
- Fahren Sie so lange fort, bis während des gesamten Passes keine Auslagerungen mehr vorgenommen werden. Dies ist der Fall, wenn alle Zeilen und Spalten von links nach rechts und von oben nach unten angeordnet sind.
Beispiel
4 2 1
3 3 5
7 2 1
Die erste Reihe des Passes wird die 4 und die 2, dann die 4 mit der 1 tauschen.
2 1 4
3 3 5
7 2 1
Wenn wir die mittlere 3 bekommen, wird sie mit der 2 unten getauscht
2 1 4
3 2 5
7 3 1
Dann werden die 5 mit der 1 getauscht
2 1 4
3 2 1
7 3 5
Die letzte Reihe des ersten Durchgangs bewegt die 7 ganz nach rechts
2 1 4
3 2 1
3 5 7
Dann kehren wir wieder in die oberste Reihe zurück
1 2 1
3 2 4
3 5 7
Und weiter Zeile für Zeile ...
1 2 1
2 3 4
3 5 7
... bis das Raster "sortiert" ist
1 1 2
2 3 4
3 5 7
Ein anderes Beispiel
3 1 1
1 1 1
1 8 9
wird
1 1 1
1 1 1
3 8 9
eher, als
1 1 1
1 1 3
1 8 9
weil der Downward-Swap Vorrang hat, wenn sowohl der rechte als auch der untere Nachbar einer Zelle gleich sind.
Eine schrittweise Referenzimplementierung finden Sie hier .
Testfälle
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
wird
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
wird
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
Regeln
- Sie können das Eingaberaster in einem beliebigen Format verwenden
- Sie können davon ausgehen, dass die Rasterwerte alle nicht negative ganze Zahlen im vorzeichenlosen 16-Bit-Bereich (0-65535) sind.
- Sie können annehmen, dass das Raster ein perfektes Rechteck und kein gezacktes Array ist. Das Gitter wird mindestens 2x2 sein.
- Wenn Sie einen anderen Sortieralgorithmus verwenden, müssen Sie einen Beweis dafür liefern, dass immer die gleiche resultierende Reihenfolge wie bei dieser speziellen Marke der 2D-Blasensortierung erzielt wird, unabhängig von der Eingabe. Ich gehe davon aus, dass dies ein nicht trivialer Beweis ist. Daher ist es wahrscheinlich besser, den beschriebenen Algorithmus zu verwenden.
Viel Spaß beim Golfen!
Antworten:
JavaScript (Node.js) , 129 Byte
Probieren Sie es online!
quelle
APL (Dyalog Unicode) , 75 Byte SBCS
Vielen Dank an @ Adám für das Speichern von 11 Bytes.
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 183 Bytes
Probieren Sie es online!
Ich bin kein Mathematica-Experte, ich bin mir sicher, dass es auch kürzer geht. Insbesondere denke ich, dass die double if-Anweisung mit Hilfe von verkürzt werden könnte,
Transpose
aber ich weiß nicht wie.quelle
R ,
169165144132 BytesProbieren Sie es online!
quelle
Sauber , 240 Bytes
Probieren Sie es online!
Implementiert den Algorithmus genau wie beschrieben.
Der Link enthält eine Eingabe-Analyse, um das Format in der Frage zu übernehmen.
quelle
Python 2 ,
215208 BytesProbieren Sie es online!
-7 Bytes dank ovs
quelle
C # (.NET Core) , 310 Byte
Ohne LINQ. Verwendet System.Collections.Generic nur zum Formatieren der Ausgabe, nachdem die Funktion zurückgegeben wurde. Die Sache ist riesig dumm. Ich freue mich auf die Golfplätze!
Probieren Sie es online!
quelle
Python 2 , 198 Bytes
Probieren Sie es online!
Unabhängig von TFelds Antwort entwickelt, weist einige Unterschiede auf.
quelle
Kohle , 118 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ich habe auch ein paar Bytes für eine schönere Formatierung ausgegeben. Erläuterung:
JavaScript hat die praktische Eigenschaft,
a[i]>a[i+1]
die false ist, wenni
es das letzte Element des Arrays ist. Um das in Charcoal zu emulieren, berechne ich a,nan
indem ich9.e999
auf Floating wirke und es dann von sich selbst subtrahiere. (Charcoal unterstützt keine exponentiellen Gleitkommakonstanten.) Dannnan
füge ich das ursprüngliche Array auf der rechten Seite mit dem hinzu und füge eine zusätzliche Zeile hinzu, die nur das enthältnan
. (Die zyklische Indizierung von Charcoal bedeutet, dass ich nur ein Element in dieser Zeile benötige.)Schleife für jedes Element im Array. Dies sollte mehr als genug Schleifen sein, um die Arbeit zu erledigen, da ich auch all die Extras mit
nan
einbeziehe.Durchlaufen Sie jeden Zeilenindex und rufen Sie die Zeile an diesem Index ab. (Charcoal kann beides mit einem Ausdruck, aber nicht mit einem Befehl tun.) Dies schließt die Dummy-Zeile ein, aber das ist kein Problem, da alle Vergleiche fehlschlagen.
Durchlaufen Sie jeden Spaltenindex und ermitteln Sie den Wert an diesem Index. Auch hier werden die Dummy-Werte durchlaufen, aber die Vergleiche schlagen erneut fehl.
Holen Sie sich auch die Werte rechts und unten.
Wenn die Zelle größer als der untere Wert ist und der untere Wert nicht größer als der rechte Wert ist, tauschen Sie die Zelle gegen den unteren Wert aus.
Andernfalls, wenn die Zelle größer als der Wert rechts ist, tauschen Sie sie aus.
Entfernen Sie die
nan
Werte und formatieren Sie das Array für die implizite Ausgabe.quelle
Kotlin , 325 Bytes
Probieren Sie es online!
quelle