Sie sind der Kapitän eines Schlachtschiffes. Die Konstruktionsabteilung hat in diesem Jahr bei den Entwürfen Abstriche gemacht, sodass das Schiff, auf dem Sie sich befinden, die Form eines einfachen Dreiecks hat.
Sie gehen auf das Deck und genießen die Meeresbrise ... wenn auch nicht lange. Ein Feind hat auf dich geschossen! - aber wird der Schuss treffen?
Eingang
Sie können entweder eine Funktion oder ein vollständiges Programm für diese Herausforderung schreiben.
Ihr Programm wird 11 ganze Zahlen enthalten, von denen zehn gepaart sind:
Die ersten drei Paare von Ganzzahlen (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) geben die Eckpunkte Ihres Schiffes an. Das gebildete Dreieck hat eine Fläche ungleich Null.
Das nächste Ganzzahlpaar (e x , e y ) gibt die Position der feindlichen Kanone an. Die feindliche Kanone wird niemals auf oder innerhalb der Grenze Ihres Schiffes liegen. *
Das Paar (a x , a y ) danach gibt an, wohin der Feind zielte. Dies unterscheidet sich von (e x , e y ).
Die letzte positive ganze Zahl R gibt die Reichweite des gegnerischen Schusses an
* Du wärst ein schrecklicher Kapitän, wenn du das nicht einmal bemerkt hättest!
Ausgabe
Sie müssen einen Wahrheitswert (z. B. true, 1) ausgeben , wenn das Schlachtschiff getroffen wird, andernfalls einen falschen Wert (z. B. false, 0).
Was ist ein Hit?
Der gegnerische Schuss ist ein gerades Liniensegment der Länge R von (e x , e y ) in Richtung von (a x , a y ). Wenn dieses Liniensegment einen Teil des Innenraums Ihres dreieckigen Schlachtschiffs überlappt , gilt dies als Treffer. Sonst ist es kein Treffer.
Schüsse, die entlang des Dreiecks grasen oder nur bis zur Grenze des Dreiecks reichen, zählen nicht als Treffer.
Beispiele
0 0 0 1 1 0
1 1
0 0
2
Treffer: Der Feind ist mitten durch dein Schiff geschossen!
2 0 0 2 4 4
0 0
1 1
1
Kein Treffer: Die Reichweite des Gegners ist zu gering, sodass Sie in Sicherheit sind.
0 0 1 2 3 0
-4 0
0 0
8
Kein Treffer: Der Feind hat die Seite Ihres Schiffes gestreift, dies zählt also nicht als Treffer. Glücklich!
0 0 -1 3 4 -1
-3 -4
3 4
5
Kein Treffer: Der gegnerische Schuss hält nur kurz vor dem Schiff an, sodass Sie in Sicherheit sind. Wenn die feindliche Kanone eine noch etwas bessere Reichweite hätte, wären Sie getroffen worden! Puh!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Treffer: Auch wenn der Schuss nicht auf die andere Seite eingedrungen ist, ist dies immer noch ein Treffer.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Kein Treffer: Für die Aufzeichnung ist dies ein weiterer enger Fehler.
Zusätzliche Testfälle
0 0 6 0 6 8
-6 -8
6 8
20
Kein Treffer: Dies ist eine weitere Weide, aber in einem Winkel.
0 0 -2 -5 5 3
-3 4
0 0
6
Treffer: Der Schuss wurde über einen Scheitelpunkt des Schiffes abgegeben.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Es gelten Standardlücken .
0 0 -1 3 4 -1 -3 -4 3 4 6
.Antworten:
Python 3, 252 Bytes
Dies sind mit Sicherheit die meisten Variablen, die ich jemals im Codegolf verwendet habe. : ^ P
Etwas ungolfed, mit Kommentaren:
Wie es funktioniert:
Probeläufe:
quelle
Python 2.7, 235 Bytes
Berechnet das Kreuzprodukt
AB x AP
zwischen den Ecken A, B und dem Punkt P. Wenn alle drei das gleiche Vorzeichen haben, befindet sich der Punkt innerhalb des Dreiecks.Ungolfed:
Tests:
quelle
C 247 Bytes
Auf jeden Fall noch nicht ganz golfen.
Gegenwärtig wird ein Ansatz verwendet, der der DLosc-Lösung ähnelt, dh es werden alle möglichen Koordinaten auf dem Liniensegment durchlaufen, um festzustellen, ob es das Dreieck schneidet. (Wenn der Bereich über 1000 liegt, schlägt dies fehl.) Es wird jedoch die Formel von http://mathworld.wolfram.com/TriangleInterior.html verwendet , um zu bestimmen, ob sich ein Punkt innerhalb des Dreiecks befindet. Dies vermeidet eine Reihe von trigonometrischen Funktionen.
Beispiel überprüfen, sollte drucken
1 0 0 0 1 0
.quelle
JavaScript (ES6) 320
448 522 627(Könnte noch mehr Golf gespielt werden?)
Schritte:
Ref:
Segmentschnittpunkt
innerhalb des Dreiecks
Punkt in einem Segment, dem ein Abstand gegeben ist
Testen Sie in Firefox
Ungolfed
quelle