In dieser Herausforderung erhalten Sie eine Karte eines zweidimensionalen Geländes, von der Seite gesehen. Leider schweben einige Teile des Geländes in der Luft, was bedeutet, dass sie abstürzen. Ihre Aufgabe ist es, vorherzusagen, wo sie landen.
Die Eingabe
Ihre Eingabe besteht aus einer oder mehreren durch Zeilenumbrüche getrennten Zeichenfolgen gleicher Länge, die nur die Zeichen #
(ein Zahlenzeichen , das einen Stein kennzeichnet) oder .
(einen Punkt, das Leerzeichen kennzeichnet) enthalten.
Die Ausgabe
Ihre Ausgabe hat dasselbe Format wie die Eingabe, jedoch mit der folgenden Änderung. Betrachten wir die Eingabezeichenfolge als zweidimensionales Gitter aus Steinen. Jeder Felsen im Eingang, der durch einen Pfad benachbarter Felsen mit dem Boden des Gitters verbunden ist, ist fest ; andere felsen sind lose . Diagonal benachbarte Gesteine gelten nicht als benachbart. Alle losen Steine fallen gerade nach unten und enden als Stapel auf einem festen Stein oder der unteren Reihe. Die losen Steine sind nicht aneinander gebunden, daher fallen sie einzeln nicht als große Formationen aus. Die Ausgabe ist das resultierende Raster.
Beispiele
Die Eingabe
..###. .##.#. .#.... .##.#.
enthält keine losen Steine, daher ist die Ausgabe identisch.
Die Eingabe
...#.. .#..#. .#..## .#...# .##### .#...#
enthält oben einen losen Stein, der auf den festen Stein darunter fällt. Die Ausgabe ist
...... .#..#. .#..## .#.#.# .##### .#...#
Die Eingabe
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
hat eine große Gruppe von losen Steinen auf der linken Seite. Die Gruppe zerfällt, wenn die Steine fallen, und der Output ist
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Klarstellungen
- Sie können entweder die Eingabe von STDIN übernehmen und an STDOUT ausgeben oder eine Funktion schreiben.
- Dies ist Code-Golf, also ist das kürzeste Programm (in Bytes) der Gewinner.
- Standardlücken sind nicht zulässig.
Antworten:
CJam,
180 ... 133 101 ... 94 9087 BytesEs ist definitiv viel Golf möglich, aber ich wollte es erst posten, nachdem es vollständig funktioniert hat.Nimmt das Rocks-Raster (bestehend aus
.
und#
ohne abschließenden Zeilenumbruch) von STDIN und druckt die Ausgabe an STDOUTUPDATE : Verwenden einer ineffizienten, aber kürzeren Teilflutfüllung, um feste Gesteine zu ermitteln.
UPDATE 2 : Der Algorithmus zum Herunterfallen der Steine wurde geändert. Jetzt viel kürzer!
UPDATE 3 : Habe einige kleine Optimierungen vorgenommen und am Ende konnte ich die Byteanzahl auf die Hälfte des ursprünglichen Codes senken!
Wie es funktioniert :
Für die Überflutung durchlaufen wir die gesamten Rasterlängen- (Raster-) Zeiten. In jeder Iteration wird garantiert, dass mindestens 1,
#
das ein Leerzeichen direkt berührt, in(Leerzeichen) konvertiert wird . Der Raum repräsentiert hier eine feste Rockgruppe. Somit ist am Ende der Längeniterationen (Gitteriterationen) garantiert, dass alle festen Gesteine durch Leerzeichen dargestellt werden.
Probieren Sie es hier online aus
quelle
Perl 5: 98
98 einschließlich 2 Befehlszeilenflags.
Erläuterung:
quelle
JavaScript (ES6) 232
Als Funktion mit einem String-Parameter und Rückgabe eines Strings.
Fügen Sie zunächst eine untere Zeile mit '1' hinzu, um die Erdungslinie zu identifizieren.
Die erste Schleife sucht nach den festen Steinen (die sich in der Nähe einer '1' befinden) und markiert sie ebenfalls als '1'. Die Suche wird wiederholt, bis keine festen Steine mehr gefunden werden.
Die zweite Schleife verschiebt die verbleibenden '#' Zeichen in die untere Reihe. Dies wird wiederholt, bis kein Stein mehr bewegt werden kann.
Ersetzen Sie zuletzt die '1' erneut durch '#' und schneiden Sie die untere Reihe aus.
Weniger golfen
Test (Sie können nachweisen, welche Steine fest sind und welche gefallen sind)
quelle
APL,
130,119Da es meines Wissens nicht möglich ist, bei Eingabeaufforderung Zeilenumbrüche einzugeben, verwendet dieses Programm eine Zeichenmatrix als Eingabe.
Der verwendete Algorithmus konvertiert zuerst in eine binäre Matrix (
0
ist Luft und1
ist Gestein) und füllt dann die unterste Reihe mit einer Flut, um festes Gestein als zu markieren2
. Teilen Sie dann jede Säule in "Zwischenräume zwischen festen Steinen" und sortieren Sie jede Trennwand so, dass der lose Stein "durch die Luft fällt".Edit1: Golf einige mit einem anderen Flood-Fill-Algorithmus
Testläufe
Führen Sie 1 aus
Definieren Sie eine Zeichenmatrix
A
und drucken Sie diese aus:Dann
A
in das Programm einspeisen:Führen Sie 2 aus
quelle
JS - 443 Bytes
Überflutung füllt die Steine von unten und bringt die nicht überfluteten Steine nach unten. Verwendet eine Menge Rekursion bei der Überflutung, so dass Ihr Browser möglicherweise eine Weile nachlässt.
Es ist eine Funktion - nennen Sie es mit
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
Ungolfed JSFiddle: http://jsfiddle.net/mh66xge6/
quelle
Python 3, 364 Bytes
Ich bin sicher, es könnte noch mehr daraus werden ... aber es wird sowieso nie mit CJam und Perl konkurrieren.
Ähnlich wie bei anderen Antworten. Eine Besonderheit ist, dass das Raster zuerst auf den Kopf gestellt wird (um die Schleifenindizes bequemer zu machen) und eine zusätzliche Zeile und Spalte
.
hinzugefügt-1
werden (um Probleme beim Umbrechen von Indizes zu vermeiden ). Laufen Sie mit einem AnrufP(string)
.quelle