Herausforderung
Sie erhalten eine ASCII-artige Darstellung von Zeichen in einer Ebene als Eingabe nach einer beliebigen vernünftigen Methode. Dies wird nur enthalten:
[a-z]
bewegliche Figuren darstellen. Jeder Buchstabe erscheint höchstens einmal an der Tafel.#
unbewegliche Wände darstellen.
leeren Raum darstellen
Beispielsweise:
abcdef.gh#..
.......ij.#.
#..#.......#
...#.#...###
.#.......#q#
.........###
Sie erhalten auch eine Zeichenfolge, die die Schwerkraftänderungen darstellt. Dies wird nur enthalten:
>
eine Änderung der Schwerkraft nach rechts darstellt<
eine Änderung der Schwerkraft nach links darstellt^
eine Änderung der Aufwärtsschwerkraft darstelltv
eine Änderung der abwärts gerichteten Schwerkraft darstellt
Beispielsweise:
v>^
Ihr Programm muss jede Änderung der Schwerkraft nacheinander simulieren, bis sich alle Zeichen nicht mehr bewegen (sie treffen auf eine Wand oder ein anderes Zeichen). Zeichen, die "vom Rand der Karte fallen", werden dauerhaft entfernt, und Zeichen können übereinander "gestapelt" werden.
In diesem Beispiel zu Beginn gibt es nach unten Gewicht ( v
), so c
, e
, g
, h
, i
, und j
die Unterseite der Karte fallen. Alle anderen Zeichen gleiten nach unten, bis sie auf eine Wand treffen, und verlassen die Karte wie folgt:
.........#..
a..d......#.
#..#.f.....#
.b.#.#...###
.#.......#q#
.........###
Dann bewegen wir uns weiter zur Schwerkraft nach rechts ( >
), was uns dazu veranlasst: Beachten Sie, wie die a
Stapel neben dem d
.
.........#..
........ad#.
#..#......f#
..b#.#...###
.#.......#q#
.........###
Zum Schluss simulieren wir die Aufwärtsschwerkraft ( ^
), während derer das a
und das b
von der Karte fallen.
.........#..
.........d#.
#..#......f#
...#.#...###
.#.......#q#
.........###
Ihre Aufgabe ist es, die verbleibenden Zeichen nach den Gravitationsverschiebungen auszugeben. Sie können in beliebiger Reihenfolge angegeben werden. In diesem Beispiel können Sie eine beliebige Permutation von ausgeben dfq
.
Testfälle
Für die folgende Karte:
abcde
.....
##.##
v = abde
v> = <nothing>
Für die folgende Karte:
######
#....#
abcdef
#.gh..
######
> = <nothing>
< = gh
^> = bcde
v< = bghef
Antworten:
JavaScript (ES6),
251233 ByteBearbeiten: 18 Bytes dank @WashingtonGuedes gespeichert.
Arbeitet durch viermaliges Drehen des Eingabegitters für jedes Richtungszeichen, aber in der Richtung, in der das Richtungszeichen mit dem Schleifenzeichen übereinstimmt, machen wir die Sache mit der linken Schwerkraft. Pseudocode:
quelle
JavaScript (ES6), 199
Gleiche Antwort von @ Neil. Das Gitter wird für jedes Richtungszeichen viermal gedreht, wenn in der rechten Position die Schwerkraftverschiebung nach links auf jede Zeile angewendet wird.
quelle
Pyth, 143 Bytes
(Brauchen wir wirklich so viele Bytes?)
Probieren Sie es online!
Wie es funktioniert
Wir definieren eine Funktion,
left
die die Schwerkraft nach links ausübt.Dann werden die anderen Richtungen implementiert, indem mit dem Array so gearbeitet wird, dass die gewünschte Richtung nach links zeigt
left
.Der Algorithmus von
left
ist hier:".X"
durch"X."
, wobeiX
ein Buchstabe steht.Das gesamte Programm ist in die folgenden 6 Abschnitte unterteilt:
Erster Abschnitt
Zweiter Abschnitt
Dritter Abschnitt
Vierter Abschnitt
Fünfter Abschnitt
Sechster Abschnitt
quelle
Ruby, 306 Bytes
Anonyme Funktion. Ziemlich umständliche Technik, die wahrscheinlich optimiert werden könnte.
quelle