Hintergrund
Ich möchte einen Zaun bauen. Dafür habe ich ein paar Stangen gesammelt und auf den Boden geklebt. Ich habe auch viele Bretter gesammelt, die ich an die Stangen nageln werde, um den eigentlichen Zaun herzustellen. Ich neige dazu, mich beim Bauen mitreißen zu lassen, und höchstwahrscheinlich werde ich die Bretter so lange an die Stangen nageln, bis es keinen Platz mehr gibt, an dem ich sie platzieren kann. Ich möchte, dass Sie die möglichen Zäune aufzählen, mit denen ich enden kann.
Eingang
Ihre Eingabe ist eine Liste zweidimensionaler ganzzahliger Koordinaten, die die Positionen der Pole in einem beliebigen geeigneten Format darstellen. Sie können davon ausgehen, dass es keine Duplikate enthält, aber Sie können nichts über die Reihenfolge annehmen.
Die Bretter werden durch gerade Linien zwischen den Polen dargestellt, und der Einfachheit halber betrachten wir nur horizontale und vertikale Bretter. Zwei Pole können durch ein Brett verbunden werden, wenn sich keine anderen Pole oder Bretter zwischen ihnen befinden, was bedeutet, dass sich die Bretter nicht kreuzen können. Eine Anordnung von Polen und Brettern ist maximal, wenn keine neuen Bretter hinzugefügt werden können (äquivalent dazu befindet sich zwischen zwei horizontal oder vertikal ausgerichteten Polen entweder ein Pol oder ein Brett).
Ausgabe
Ihre Ausgabe ist die Anzahl der maximalen Anordnungen, die unter Verwendung der Pole konstruiert werden können.
Beispiel
Betrachten Sie die Eingabeliste
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)]
Von oben gesehen sieht die entsprechende Anordnung der Pole ungefähr so aus:
o
o o
o o
o o
o
Es gibt genau drei maximale Anordnungen, die unter Verwendung dieser Pole konstruiert werden können:
o o o
o-o o|o o-o
o----o o||| o o| | o
o-o o|o o-o
o o o
Somit ist die korrekte Ausgabe 3
.
Regeln
Sie können entweder eine Funktion oder ein vollständiges Programm schreiben. Die niedrigste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig.
Testfälle
[] -> 1
[(0,0),(1,1),(2,2)] -> 1
[(0,0),(1,0),(2,0)] -> 1
[(0,0),(0,1),(1,0),(1,1)] -> 1
[(1,0),(0,1),(-1,0),(0,-1)] -> 2
[(3,0),(1,1),(0,2),(-1,1),(-2,0),(-1,-1),(0,-2),(1,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1)] -> 3
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1)] -> 4
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(0,-1),(2,2)] -> 5
[(0,0),(4,0),(1,1),(1,-2),(3,1),(3,-2),(2,-1),(4,-1),(0,-1),(2,2)] -> 8
(0,-2)
, guter Fang. Jetzt ändern.Antworten:
Mathematica, 301 Bytes
Dies ist eine unbenannte Funktion, die die Koordinaten als verschachtelt verwendet
List
und eine Ganzzahl zurückgibt. Das heißt, Sie können ihm entweder einen Namen geben und ihn nennen oder einfach anhängenMit Einrückung:
Ich kann nicht einmal anfangen auszudrücken, wie naiv diese Implementierung ist ... es könnte definitiv nicht brutaler sein ...
o--o--o
nur zwei statt drei Zäune entstehen).Überraschenderweise werden alle Testfälle praktisch sofort gelöst.
Ein wirklich netter Trick, den ich dafür entdeckt habe, ist die Verwendung
Orderless
, um die Anzahl der Muster zu reduzieren, die ich anpassen muss. Wenn ich Zaunsets mit sich kreuzenden Zäunen abgraben möchte, muss ich im Wesentlichen ein Paar vertikaler und horizontaler Zäune finden und den Zustand auf ihnen überprüfen. Aber ich weiß nicht, in welcher Reihenfolge sie erscheinen werden. Da Listenmuster normalerweise auftragsabhängig sind, würde dies zu zwei wirklich langen Mustern führen. Also ersetze ich stattdessen die umgebende Liste durch eine Funktiont
mitt @@@
- die nicht definiert ist, so dass sie so gehalten wird, wie sie ist. Aber diese Funktion istOrderless
, so dass ich kann nur einen einzigen Auftrag in dem Muster überprüfen, und Mathematica prüft es gegen alle Permutationen. Danach habe ich die Listen wieder mit erstelltList @@@
.Ich wünschte, es gäbe eine integrierte Funktion, die a)
Orderless
, b) nichtListable
und c) nicht für 0 Argumente oder Listenargumente definiert ist. Dann könnte ich das ersetzent
. Aber es scheint keinen solchen Operator zu geben.quelle
Haskell, 318 Bytes
Verwendung :
p [(1,0),(0,1),(-1,0),(0,-1)]
. Ausgabe:2
Wie es funktioniert:
quelle