Die Herausforderung
Geben Sie bei einer beliebigen Anzahl von Rechtecken die Gesamtzahl der Schnittpunkte dieser Rechtecke aus, wenn diese in einer 2D-Ebene gezeichnet werden.
Ein Schnittpunkt ist hier definiert als ein Punkt, P
der von zwei Linien gekreuzt wird, die orthogonal zueinander sind und beide nicht enden P
.
Beispiel
Jedes Rechteck wird hier durch ein 2-Tupel gekennzeichnet, wobei die Koordinaten der oberen linken Ecke zuerst und die Koordinaten der unteren rechten Ecke an zweiter Stelle stehen.
[(-8,6), (-4, -2)] [(-4,9), (4,3)] [(2,10), (14,4)] [(1,7), (10, -6)] [(7,4), (10,2)] [(5,2), (9, -4)] [(-6, -4), (-2, -6)]
Diese Rechtecke erzeugen 6 Schnittpunkte, die Ihre Ausgabe sein müssen.
- Wie Sie im obigen Bild sehen können, werden durch Berühren von Rechtecken hier keine Schnittpunkte erstellt und nicht gezählt.
- Sie können die Rechtecke in jedem gewünschten Format codieren. Machen Sie deutlich, welches Format Sie verwenden.
- Wenn sich mehrere Rechtecke am selben Punkt schneiden, zählt dies nur als ein Schnittpunkt.
- Die Koordinaten sind immer ganze Zahlen.
- Die Eingabe enthält keine doppelten Rechtecke.
- Sie erhalten immer mindestens ein Rechteck als Eingabe.
- Sie dürfen keine integrierten Funktionen verwenden, die dieses Problem direkt lösen. Außerdem dürfen Sie keine integrierten Funktionen verwenden, die Gleichungen lösen. Alle anderen Einbauten sind erlaubt.
- Die Ausgabe muss eine einzelne Ganzzahl sein, die die Anzahl der Schnittpunkte angibt.
Regeln
- Funktion oder volles Programm erlaubt.
- Standardregeln für die Eingabe / Ausgabe.
- Es gelten Standardlücken .
- Dies ist Code-Golf , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Einreichung.
Testfälle
Gleiches Format wie im obigen Beispiel. Die Rechtecke werden in eine Liste eingeschlossen.
[[(-8,6), (-4, -2)], [(-4,9), (4,3)], [(2,10), (14,4)], [(1 , 7), (10, -6)], [(7,4), (10,2)], [(5,2), (9, -4)], [(-6, -4), (-2, -6)]] -> 6 [[(-2,2), (6, -4)]] -> 0 [[(-12,10), (- 8,6)], [(- 14,6), (- 10,2)], [(- 10,6), (- 6,2)]] - > 0 [[(-4,10), (6,2)], [(- 2,8), (4,3)], [(1,6), (8,4)], [(2,11 ), (5,5)]] -> 10 [[(8,2), (12, -2)], [(10,0), (14, -4)] -> 2 [[(0,2), (2,0)], [(0,1), (3,0)]] -> 1 [[(-10, -2), (-6, -6)], [(-6, -2), (-2, -6)], [(-8, -4), (-4, -8)]] -> 3
Viel Spaß beim Codieren!
[[(0,0),(1,2)],[(0,0),(2,1)]]
ich also 1 Kreuzung?Antworten:
JavaScript (ES6), 186 Bytes
Teilt jedes Rechteck in seine Komponentenlinien, schneidet dann die horizontalen und vertikalen Linien und erstellt eine Liste von Schnittpunkten, um Duplikate zu vermeiden.
quelle
[[-4,10,6,2],[-2,8,4,3],[1,6,8,4],[2,11,5,5]]
. Da JavaScript keine Tupel enthält, hätten Sie, wenn Sie versucht hätten, Ihre Beispiele wörtlich zu verwenden, stattdessen den Kommaoperator ausgelöst und die Eingabe ungültig gemacht.Mathematica 138 Bytes
Nicht beendet! Dies funktioniert in allen Fällen außer
[[(0,0),(1,2)],[(0,0),(2,1)]]
Beispiel
quelle