Eine arborally erfüllte Punktmenge ist eine 2D-Punktmenge, bei der für jedes achsenausgerichtete Rechteck, das unter Verwendung von zwei Punkten in der Menge als gegenüberliegende Ecken gebildet werden kann, dieses Rechteck mindestens einen anderen Punkt enthält oder berührt. Hier ist eine gleichwertige Definition aus Wikipedia:
Eine Punktmenge gilt als arboral erfüllt, wenn die folgende Eigenschaft gilt: Für jedes Paar von Punkten, die nicht beide auf derselben horizontalen oder vertikalen Linie liegen, gibt es einen dritten Punkt, der in dem von den ersten beiden Punkten aufgespannten Rechteck liegt ( entweder innerhalb oder an der Grenze).
Das folgende Bild zeigt, wie die Rechtecke gebildet werden. Dieser Punktesatz ist nicht bäuerlich erfüllt, da dieses Rechteck mindestens einen weiteren Punkt enthalten muss.
In ASCII-Kunst kann diese Punktmenge wie folgt dargestellt werden:
......
....O.
......
.O....
......
Eine geringfügige Modifikation kann dies arborally befriedigen:
......
....O.
......
.O..O.
......
Oben sehen Sie, dass alle Rechtecke (von denen es nur ein Rechteck gibt) mindestens drei Punkte enthalten.
Hier ist ein weiteres Beispiel für eine komplexere Punktmenge, die auf dem Baum erfüllt ist:
Für jedes Rechteck, das über zwei Punkte gezeichnet werden kann, enthält dieses Rechteck mindestens einen weiteren Punkt.
Die Herausforderung
Ausgehend von einem rechteckigen Gitter von Punkten (die ich darstelle O
) und einem leeren Raum (die ich darstelle .
), geben Sie einen Wahrheitswert aus , wenn er vom Baum erfüllt ist, oder einen Falschwert , wenn er nicht erfüllt ist. Das ist Code-Golf.
Zusätzliche Regeln:
- Sie können die Zeichen auswählen
O
und.
mit jedem anderen Paar druckbarer ASCII-Zeichen austauschen. Geben Sie einfach an, welche Zeichenzuordnung Ihr Programm verwendet. - Das Gitter wird immer rechteckig sein. Ein abschließender Zeilenumbruch ist zulässig.
Mehr Beispiele
Baum zufrieden:
.OOO.
OO...
.O.OO
.O..O
....O
..O..
OOOO.
...O.
.O.O.
...OO
O.O.
..O.
OOOO
.O.O
OO..
...
...
...
...
..O
...
O.....
O.O..O
.....O
OOO.OO
Nicht zufrieden mit dem Baum:
..O..
O....
...O.
.O...
....O
..O..
O.OO.
...O.
.O.O.
...OO
O.....
..O...
.....O
Antworten:
Schnecken , 29
30 39BytesEs funktioniert, indem zwei Seiten des Rechtecks nachgezeichnet werden und dann geprüft wird, ob es ein Quadrat mit einem O gibt, sodass das Fahren in einer geraden Linie vom Quadrat in zwei Hauptrichtungen dazu führt, dass eine Seite des Rechtecks berührt wird.
Gibt das Maximum von 1 und die Rasterfläche aus, wenn die Eingabe "arborally satisfied" ist. sonst 0.
quelle
Oracle SQL 11.2,
364344 Bytes: g ist das Gitter als Zeichenfolge
: w ist die Breite des Gitters
Gibt keine Zeile als wahr zurück, gibt die Rechtecke, die nicht den Kriterien entsprechen, als falsch zurück
Nicht golfen
Die Ansicht v berechnet die Koordinaten jedes O-Punktes.
Der erste Teil des Minus gibt alle Rechtecke zurück. Die where-Klausel stellt sicher, dass ein Punkt nicht mit sich selbst gepaart werden kann.
Der zweite Teil sucht in jedem Rechteck nach einem dritten Punkt. Dieser Punkt muss eine Koordinate haben, x oder y, die dieser Koordinate für einen der beiden Punkte entspricht, die das Rechteck definieren. Die andere Koordinate dieses dritten Punktes muss in dem Bereich liegen, der durch diese Koordinate für jeden der Punkte begrenzt ist, die das Rechteck definieren.
Der letzte Teil der where-Klausel stellt sicher, dass der dritte Punkt nicht einer der beiden Punkte ist, die das Rechteck definieren.
Wenn alle Rechtecke mindestens einen dritten Punkt haben, entspricht der erste Teil des Minus dem zweiten Teil und die Abfrage gibt nichts zurück.
quelle
MATL , 38 Bytes
Dies verwendet ein 2D-Zeichen-Array als Eingabe, wobei die Zeilen durch voneinander getrennt sind
;
. Das erste Beispiel ist alsoDie restlichen Testfälle in diesem Format lauten wie folgt.
Baum zufrieden:
Nicht bäuerlich zufrieden:
Probieren Sie es online! Sie können auch alle Testfälle gleichzeitig überprüfen .
Erläuterung
Der Code erhält zuerst die Koordinaten der Zeichen
O
in der Eingabe. Dann werden zwei verschachtelte Schleifen verwendet. Die äußere Schleife wählt jeden Punkt P (2-Tupel seiner Koordinaten) aus, vergleicht ihn mit allen Punkten und speichert Punkte, die sich in den beiden Koordinaten von P unterscheiden. Das sind die Punkte, die mit P ein Rechteck bilden können. Nenne sie set R.Die innere Schleife wählt jeden Punkt T aus R aus und prüft, ob das durch P und T definierte Rechteck mindestens 3 Punkte enthält. Dazu subtrahiert es P von allen Punkten; Das heißt, der Koordinatenursprung wird nach P verschoben. Ein Punkt befindet sich im Rechteck, wenn sich jede seiner durch die entsprechende Koordinate von T geteilten Koordinaten im geschlossenen Intervall [0, 1] befindet.
quelle
PHP,
1123 Bytes,851 Bytes, 657 Bytes(Neuling php)
Erklärung (kommentierter Code):
quelle
C 289 Bytes
Erfordert nachgestellte Zeilenumbrüche, was zulässig ist (ohne diese Zeilenumbrüche wäre der Code zwei Byte größer). Ausgänge 0 (nicht bäuerlich erfüllt) oder 1 (bäuerlich erfüllt).
quelle