Überblick
Pearls (oder Masyu) ist ein Logikspiel, das auf einem Raster gespielt wird. Es gibt schwarze und weiße Perlen auf dem Gitter. Das Ziel ist es, eine einzelne, geschlossene Schleife zu bilden , die jede Perle nur mit geraden Liniensegmenten und rechten Winkeln durchläuft.
Es gibt einige Regeln, die bestimmen, wie die Schleife mit Perlen interagiert:
- Weiße Perlen müssen gerade durchlaufen werden, aber die Schleife muss sich in der vorherigen und / oder nächsten Zelle auf ihrem Weg drehen .
- Schwarze Perlen müssen einge auf, aber die Schleife muss reisen gerade durch die nächsten und vorherigen Zellen in seinem Weg.
- Die Schleife darf sich nicht kreuzen oder anderweitig kreuzen. Alle Zellen haben genau null oder zwei Schleifenein- / ausgänge.
Ein Beispielpuzzle aus Wikipedia (und seiner Lösung):
Ihr Ziel ist es, ein bestimmtes Rätsel zu lösen. Wenn es mehrere mögliche Lösungen gibt, spielt es keine Rolle, welche Sie geben.
Eingang
Die Eingabe ist ein ungelöstes quadratisches Gitter. Das oben gezeigte Beispiel würde folgendermaßen aussehen:
..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b
w
ist eine weiße Perle, b
ist eine schwarze Perle und .
ist eine leere Zelle.
Angenommen, die Eingabe ist gültig. Dies bedeutet, dass es gut geformt ist und mindestens eine Lösung möglich ist. Alle gültigen Rätsel sind mindestens 3x3 und enthalten mindestens eine Perle.
Ausgabe
Die Ausgabe ist eine Folge von Koordinaten, die den Pfad darstellen. Die linke obere Ecke des Gitters ist 0 0
, die rechte obere Ecke ist n-1 0
, wobei n die Breite des Gitters ist.
Ein Pfad besteht einfach aus einer Reihe geordneter Koordinaten:
x1 y1 x2 y2 x3 y3 ...
Es wird davon ausgegangen, dass der Pfad geschlossen ist, sodass Sie die erste Koordinate am Ende nicht wiederholen müssen , es gibt jedoch keine Strafe dafür.
Die Ausgabe sollte aus mindestens allen Ecken im Pfad bestehen. Sie müssen nicht jede Zelle auf dem Pfad ausgeben, wenn es keine Kurve gibt. Die Ausgabe für das Beispiel könnte beispielsweise beginnen mit:
1 0 5 0 5 1 ...
oder
1 0 2 0 3 0 4 0 5 0 5 1 ...
Ausgabe sollte nicht jede Zelle nicht im Pfad enthalten. Sie können an einer beliebigen Zelle im Pfad beginnen.
Ausschnitt
Hier ist ein Ausschnitt, mit dem Sie Ihre Lösung visualisieren können. Fügen Sie einfach das Raster ein, an dem Sie arbeiten, und den Pfad, den Sie ausgeben. Mir ist bewusst, dass es schmerzhaft ist, meinen Code zu betrachten.
Testfälle
Diese Testfälle zeigen eine mögliche Ausgabe für jede Eingabe (mit Ausnahme der letzten, die als ungelöst angezeigt wird). Möglicherweise gibt es andere gültige Pfade, Sie können im Uhrzeigersinn oder gegen den Uhrzeigersinn fahren oder an einem anderen Punkt beginnen usw. Die Lösungen sollten in der Lage sein, die Testfälle in Sekunden / Minuten / Stunden und nicht in Tagen / Wochen / Äonen zu lösen.
...
w..
..b
0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1
.wb..b
......
..b...
w.ww..
......
b....b
0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1
.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..
quelle
Antworten:
C 590
640 760 880 963 1018Brute Force ist dafür ziemlich schnell. Der 12x12 Test läuft unter 10ms. Zu wissen, dass sich für eine Sprache entscheiden könnte, die besser zum Golfen geeignet ist.
Ich gehe nicht davon aus, dass das Brett quadratisch ist, da die größeren Puzzles nicht quadratisch sind.
Das
W
Define legt die Grenze für die Platinenabmessungen fest. Die tatsächliche Grenze ist kleiner,W - 2
da ich zusätzliche Zeilen für Rahmen verwende, um Grenzüberprüfungen zu vermeiden.Teste mich .
Hier ist ein schwierigerer Testfall:
Ich hatte das Glück, dass mein Code die Lösung ziemlich früh im Lauf findet (<5 Minuten), aber die vollständige Suche dauert viel länger (67 Minuten).
quelle
Python - 1669
Immer noch ziemlich lang, aber schnell genug, um das letzte Beispiel in weniger als einer Sekunde auf meinem Computer auszuführen. Es ist wahrscheinlich möglich, auf Kosten der Geschwindigkeit kürzer zu machen, aber im Moment ist es ziemlich gleichbedeutend mit dem ungolfed Code.
Beispielausgabe für letzten Testfall:
Code:
Ungolfed:
quelle
Lua,
830810765752739729710Läuft Board1 und Board2 ganz gut, dauert aber eine Weile auf Board3.
Es könnten 9 Bytes eingespart werden, indem jeder Pfad anstatt nur der erste ausgegeben wird ...
quelle