Hintergrund
Ein Polyomino heißt L-konvex , wenn es möglich ist, über einen L-förmigen Pfad von einem Plättchen zu einem anderen zu gelangen, dh einen Pfad, der in die Hauptrichtung verläuft und die Richtung höchstens einmal ändert. Zum Beispiel das Polyomino von 1
s in der Figur
0 0 1 1 1 0
1 1 1 1 0 0
1 1 0 0 0 0
ist nicht L-konvex, da beide L-förmigen Pfade von links unten 1
nach rechts oben a 1
enthalten 0
:
0>0>1>1>1 0
^ ^
1 1 1 1 0 0
^ ^
1>1>0>0>0 0
Das Polyomino von 1
s in dieser Figur ist jedoch L-konvex:
0 1 1 1 0 0
1 1 1 1 1 1
0 1 1 0 0 0
Eingang
Ihre Eingabe ist ein 2D-Array von Bits im ursprünglichen Format Ihrer Sprache oder eine durch Zeilenumbrüche getrennte Zeichenfolge, wenn unsere Sprache keine Arrays enthält. Es wird garantiert, um mindestens ein zu enthalten 1
.
Ausgabe
Ihre Ausgabe soll ein wahrer Wert sein, wenn die Menge von 1
s ein L-konvexes Polyomino ist, und ein falscher Wert, wenn nicht. Diese Ausgaben müssen konsistent sein: Sie müssen für alle L-konvexen Eingaben den gleichen Wahrheitswert und für andere den gleichen falschen Wert ausgeben. Beachten Sie, dass eine getrennte Menge von 1
s (die kein Polyomino ist) zu einer falschen Ausgabe führt.
Regeln und Wertung
Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt und Standardlücken sind nicht zulässig.
Testfälle
Diese Testfälle sollten auch funktionieren, wenn Sie die Arrays drehen oder spiegeln oder Zeilen von 0
s zu beliebigen Rändern hinzufügen .
False instances
01
10
111
101
111
1101
1111
1110
1100
1000
0011
01100
11110
01110
00110
011000
011110
001111
True instances
1
01
11
010
111
010
001
011
111
11100
11110
01100
01000
011000
011000
111100
111111
001000
Antworten:
Schnecken ,
4524Gleich nach der Veröffentlichung meiner ersten Lösung wurde mir klar, dass es einen viel besseren Weg gibt. Das ursprüngliche Programm bewegte sich um das Quadrat, das durch die Pfade zwischen zwei
1
Sekun- den gebildet wurde, und prüfte auf das Vorhandensein einer 0 in jedem Seitenpaar. Es musste auch einen Sonderfall für gerade Strecken geben. Die neue Version beginnt mit dem Teleportieren von einem1
zum anderen und dem Testen, ob keine gerade oder L-förmige Bahn von1
s zum Start vorhanden ist.quelle
Matlab, 182 Bytes
Idee: Für jeden wiederholen
1
in der Polyomino-Matrix:1
aber der restlichen Null.1
in dieser neuen Matrix (wiederholen, bis sich nichts mehr ändert)1
als Nachbarn in x-Richtung hinzu, wenn es1
als Nachbarn im Polynom gibt1
in dieser neuen Matrix (wiederholen, bis sich nichts mehr ändert)1
als Nachbarn in x-Richtung hinzu, wenn es1
als Nachbarn im Polynom gibtJetzt sollte
1
in der neuen Matrix alles1
in der Polynom-Matrix abgedeckt sein, was vom angegebenen Startpunkt aus erreichbar ist, indem zuerst in x-Richtung und dann in y-Richtung gegangen wird. Jetzt können wir den gleichen Vorgang wiederholen, jedoch zuerst in y-Richtung und dann in x-Richtung. Jetzt sollte jede1
der Polyominomatrix einmal oder beide Male erreicht werden. Wenn nicht, dann haben wir eine Position in der Polynommatrix gefunden, die nicht von jeder anderen Position durch einenL
-Pfad erreicht werden kann.Golf gespielt:
Mit Kommentaren:
Skript für Testfälle:
quelle
Javascript ES6, 290 Bytes
Ok, vielleicht wird es keine Preise für Kürze gewinnen, aber es verwendet einen neuartigen Ansatz. In der ungolfed Version erfahren Sie, wie es funktioniert.
Der Beweis für diese Methode findet sich in: Zelluläre Automaten und Diskrete Komplexe Systeme .
Ungolfed:
quelle
Mathematica,
129127 BytesErläuterung:
Erstens ist das Array nicht L-konvex , wenn sich
0
zwischen zwei1
s in derselben Zeile oder Spalte befindet, da wir die beiden1
s nicht verbinden können .Nach dem Ausschließen dieses Falls können alle zwei
1
s in derselben Zeile oder Spalte durch einen geraden Pfad verbunden werden. Wir können ein Diagramm erstellen, dessen Scheitelpunkte die Positionen von1
s im Array sind und dessen Kanten Paare von1
s in derselben Zeile oder Spalte sind. Dann ist das Array genau dann L-konvex, wenn der Durchmesser des Graphen kleiner als 3 ist.quelle
JavaScript (ES6) 174
Wenn ich das Raster aus leeren oder gefüllten Zellen betrachte, überprüfe ich für jedes Paar gefüllter Zellen die horizontalen Pfade zur anderen Zellenspalte (es kann 1 geben, wenn sich die Zellen in derselben Zeile befinden, sonst 2) und die vertikalen Pfade zur andere Zellenreihe (es können auch 1 oder 2 sein). Wenn ich in beiden vertikalen Pfaden oder beiden horizontalen Pfaden eine leere Zelle finde, kann es keinen L-förmigen Pfad zwischen den Zellen geben.
(Es fiel mir schwer, diese Erklärung zu formulieren - ich hoffe, es war klar)
Testen Sie das folgende Snippet in einem beliebigen EcmaScript 6-kompatiblen Browser
quelle