Hintergrund
Sie sind der Lehrling eines mächtigen Zauberers, und Ihr Meister entwickelt derzeit einen Zauberspruch für die Schaffung eines interdimensionalen Labyrinths, in das er seine Feinde einfängt. Er möchte, dass Sie seinen dampfbetriebenen Computer so programmieren, dass er die möglichen Layouts analysiert. Das Programmieren dieser teuflischen Maschine ist äußerst gefährlich, daher sollten Sie den Code so kurz wie möglich halten.
Eingang
Ihre Eingabe ist ein zweidimensionales Raster aus Punkten .
und Hashes #
, das leere Räume und Wände als durch Zeilenumbrüche getrennte Zeichenfolge kennzeichnet. Es wird immer mindestens eins .
und eins geben #
, und Sie können entscheiden, ob es eine nachgestellte Zeile gibt oder nicht.
Dieses Gitter ist die Blaupause eines unendlichen Labyrinths, bei dem unendlich viele Kopien des Gitters nebeneinander ausgerichtet werden. Das Labyrinth ist in Hohlräume unterteilt , die miteinander verbundene Bestandteile von Leerräumen sind (diagonal benachbarte Räume sind nicht miteinander verbunden). Zum Beispiel das Gitter
##.####
...##..
#..#..#
####..#
##...##
ergibt folgendes Labyrinth (unendlich in alle Richtungen fortgesetzt):
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
Dieses besondere Labyrinth enthält einen Hohlraum mit unendlicher Fläche. Andererseits führt diese Blaupause zu einem Labyrinth mit nur endlichen Hohlräumen:
##.####
##..###
####...
..####.
#..####
Ausgabe
Ihre Ausgabe ist ein wahrer Wert, wenn das Labyrinth eine unendliche Höhle enthält, und ein falscher Wert, wenn nicht. Beachten Sie, dass das Labyrinth sowohl endliche als auch unendliche Hohlräume enthalten kann. In diesem Fall ist die Ausgabe wahr.
Regeln
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Zusätzliche Testfälle
Unendliche Hohlräume:
.#
#.#
...
#.#
#.###.#.###.#
#.#...#...#.#
#.#.#####.#.#
..#.#...#.#..
###.#.#.#.###
#...#.#.#...#
#.###.#.###.#
##.###
#..###
..##..
###..#
##..##
..#..#..#..#..#..#
.#..#..#..#..#..#.
#..#..#..#..#..#..
#.####.###.###.####
#...#..#...###..###
###.#..#.######..##
....####.#######...
###..###...########
##########.##....##
..###......##.##...
#.........##..#####
###########..###..#
#...........####..#
#.###########.##..#
#.##....##.....####
#.####.###.###.####
Endliche Hohlräume:
###
#.#
###
.#
#.
####
.#..
####
#.#.#
..#..
#####
..#..
#.#.#
#.#.#.#.#.#
..#...#.#..
###.###.###
..#.#......
#.#.#######
#.#.......#
#.#######.#
#.#.....#.#
#.#.#.#.#.#
##....#####
.#..#...##.
.##.#..#...
..###.###..
#..##.#####
#...##....#
#.#.#####.#
###..####.#
....####...
###...#####
###....##.#########
####...##....#...##
..####.#######.###.
....##..........##.
###..#####.#..##...
####..#..#....#..##
..###.####.#.#..##.
..###...#....#.#...
..####..##.###...##
#.####.##..#####.##
####...##.#####..##
###########
........#..
#########.#
..........#
.##########
.#.........
##.########
...#.......
.
und eine#
in der Eingabe.Antworten:
JavaScript (ES6), 235
253Gleiche Methode wie bei @mac. Für jede freie Zelle versuche ich eine rekursive Füllung und markiere benutzte Zellen mit der von mir verwendeten Koordinate (die außerhalb der Originalvorlage liegen kann). Wenn ich während des Füllens zu einer Zelle komme, die bereits mit einer anderen Koordinate markiert ist, befinde ich mich auf einem unendlichen Pfad.
Die skurrile Art, mit dem Modulo in JS umzugehen, ist ziemlich ärgerlich.
Test In der Firefox / FireBug-Konsole
Unendlich
Ausgabe
Endlich
Ausgabe
quelle
(j%4-1)%2
ergibt ein schönes sich wiederholendes Muster.L=
.C # -
423375 BytesVollständiges C # -Programm, akzeptiert Eingaben über STDIN, gibt je nach Bedarf "True" oder "False" an STDOUT aus.
Ich konnte es nicht ertragen, diesen Linq dort zu lassen ... zum Glück hat sich seine Entfernung ausgezahlt! Es verfolgt jetzt gesehene und besuchte Zellen in einem Array (da es sowieso immer nur eine begrenzte Anzahl von ihnen betrachtet). Ich habe auch den Richtungscode neu geschrieben, um die Notwendigkeit für ein Lambda zu beseitigen und den Code im Allgemeinen unverständlicher zu machen (aber mit erheblichen Byteeinsparungen).
Es ist eine Breitensuche (nicht, dass es darauf ankommt), die nur so lange dauert, bis sie entweder in einer endlichen Höhle steckt oder die Höhle so groß ist, dass sie unendlich groß sein muss (wenn sie so viele Zellen wie die hat) Dies bedeutet, dass es einen Pfad von einer Zelle zu sich selbst geben muss, dem wir für immer folgen können.
Nicht zugeschnittener Code:
quelle
C#
Antwort als Top-Wähler gesehen habe.Python 2 -
258210244 BytesÜberprüfen Sie rekursiv die Pfade, wenn der Stapelüberlauf 1 (wahr) zurückgibt, andernfalls None (falsch).
quelle
;
für die Zeilen in verwendenp
, da Sie sie in derselben Zeile wie für die Zeilen in erhaltenif
.Python 2 -
297286275 BytesWählt eine beliebige "offene" Zelle aus, von der aus eine Überflutung beginnen soll. Labyrinth ist unendlich, wenn wir während des Füllens eine Zelle erneut besuchen, die wir bereits besucht haben, aber sie hat eine andere Koordinate als der vorherige Besuch. Wenn die Überflutungsfüllung die gesamte Region ausfüllt, ohne eine solche Zelle zu finden, versuchen Sie es mit einer anderen Region. Wenn eine solche Region nicht gefunden werden kann, ist das Labyrinth endlich.
Lässt die Datei in der Befehlszeile verarbeiten, gibt den Exit-Code
1
für unendlich und zurück0
für endlich zurück.Gibt korrekte Ergebnisse für alle Testfälle zurück.
quelle