Kreise und Quadrate haben einen einzigen, bestimmten Mittelpunkt. Der Begriff des Mittelpunkts eines Dreiecks ist jedoch schon lange diskutiert worden. Den alten Griechen waren vier verschiedene Zentren bekannt:
- Incenter : Der Schnittpunkt der Winkelhalbierenden des Dreiecks
- Schwerpunkt : Der Schnittpunkt der Linien von jedem Scheitelpunkt des Dreiecks zur Mitte der gegenüberliegenden Seite
- Circumcenter : Der Schnittpunkt der senkrechten Winkelhalbierenden der Seiten
- Orthozentrum : Der Schnittpunkt der Höhen des Dreiecks
Euler bewies später, dass der Schwerpunkt, das Zirkumzentrum und das Orthozentrum in jedem Dreieck kollinear sind. Die Linie, auf der sich diese drei Punkte in einem Dreieck befinden, wird als Euler-Linie bezeichnet . Es wird für jedes Dreieck definiert, mit Ausnahme eines gleichseitigen Dreiecks, bei dem alle Punkte zusammenfallen.
Ihre Herausforderung besteht darin, das kürzeste Programm oder die kürzeste Funktion zu erstellen, die bei zwei Eingaben einen bestimmten Mittelpunkt oder die Euler-Linie des Dreiecks ausgibt. Die erste gibt die Koordinaten jedes Scheitelpunkts eines Dreiecks an. Die Sekunde ist eine Ganzzahl von 1 bis 5, die bestimmt, was ausgegeben werden soll.
1 - Incenter
2 - Centroid
3 - Circumcenter
4 - Orthocenter
5 - Equation of Euler Line
(if the Euler Line is vertical, output the `x` value of the line
(e.g. output `5` if the equation of the line is `x = 5`))
Sie können davon ausgehen, dass die angegebenen Eckpunkte niemals kollinear und immer ganzzahlige Koordinaten sind (dies schließt auch die Möglichkeit aus, ein gleichseitiges Dreieck als Eingabe gemäß dem Kommentar von @ R.Kap zu verwenden ).
Das Eingabearray sollte ein gültiges verschachteltes Array in Ihrer Sprache sein und die Eingabe sollte in einem angemessenen Format erfolgen. Alle Float-Werte sollten mit mindestens 3 Dezimalstellen, jedoch nicht weniger, angezeigt werden. Ein ausgegebener Punkt sollte ein gültiges Array in Ihrer Sprache sein, das mit dem Eingabeformat übereinstimmt.
Testfälle:
Input: [(-2, 0), (1, 0), (0, 1)] 1
Output: (-0.089, 0.451)
Input: [(-2, 0), (1, 0), (0, 1)] 2
Output: (-0.333, 0.333)
Input: [(-2, 0), (1, 0), (0, 1)] 3
Output: (-0.5, -0.5)
Input: [(-2, 0), (1, 0), (0, 1)] 4
Output: (0, 2)
Input: [(-2, 0), (1, 0), (0, 1)] 5
Output: 5x + 2
Erläuterung: Die Eingabe kann entweder von stdin, durch Leerzeichen oder Zeilenumbrüche getrennt oder als Argument für eine Funktion erfolgen. Die Ausgabe muss jedoch auf stdout geschrieben werden.
y=f(x)
.(if the triangle is equilateral, output the point at which the centers meet)
da es nicht möglich ist, ein gleichseitiges Dreieck in der Koordinatenebene nur mit ganzzahligen Koordinaten zu erstellen.Antworten:
Python -
908870Zeilenumbrüche wurden hinzugefügt, um das Scrollen zu reduzieren. Dies könnte wahrscheinlich weiter golfen werden.
Testfälle (kommentiert):
Wie Sie sehen können, sind möglicherweise Fehler durch die Verwendung von Gleitkommazahlen zu erwarten.
Weiteres Golfen:
Aufgrund der Vorschläge in den Kommentaren unten habe ich es geschafft, dies zu verkleinern.
quelle
R=r.append
und dann das durchgehend verwenden, um Bytes zu sparen?AutoHotkey - 731
Die Funktion kann durch Kürzen der Variablennamen wie midx_a, midx_b usw. weiter verkleinert werden (auf etwa 600 Zeichen ODER weniger).
Funktion aufrufen
quelle
Python 3.5,
851772 Bytes:Nimmt die Eingabe als Folge von durch Kommas getrennten Koordinaten, gefolgt von einer Ganzzahl, die angibt, was ausgegeben werden soll. Wenn zum Beispiel die Eingabekoordinaten lauten
(1,0),(2,1),(1,4)
und Sie möchten, dass das Orthozentrum des Dreiecks diesen Koordinaten entspricht, würden Sie die Funktion einfach wie folgt aufrufen:Gibt das Format eines Tupels aus, wenn ein bestimmter Punkt benötigt wird, das Format einer Zeichenfolge mit der Gleichung in der Form,
y=mx+b
wenn die Euler-Linie benötigt wird und die Linie nicht vertikal ist, oder einfach denx
Wert der Linie, wenn die Euler-Linie benötigt wird wird benötigt, aber die Linie ist vertikal.Bei Verwendung des Dreiecks mit Eckpunkten
(1,0),(2,1),(1,4)
wären die Ausgaben also:Ich werde versuchen, dies im Laufe der Zeit zu tun, wo und wann ich kann.
Probieren Sie es online! (Ideone)
quelle