Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Triangle type |
Level: | 6 kyu |
Sprache: | TypeScript |
Beschreibung:
In this kata, you should calculate the type of triangle with three given sides a
, b
and c
(given in any order).
If each angle is less than 90°
, this triangle is acute
and the function should return 1
.
If one angle is strictly 90°
, this triangle is right
and the function should return 2
.
If one angle is more than 90°
, this triangle is obtuse
and the function should return 3
.
If three sides cannot form a triangle, or one angle is 180°
(which turns the triangle into a segment) - the function should return 0
.
Three input parameters are sides
of given triangle. All input values are non-negative floating point or integer numbers (or both, depending on the language).
|
|
|
Examples:
(2, 4, 6) ---> return 0 (Not triangle)
(8, 5, 7) ---> return 1 (Acute, angles are approx. 82°, 38° and 60°)
(3, 4, 5) ---> return 2 (Right, angles are approx. 37°, 53° and exactly 90°)
(7, 12, 8) ---> return 3 (Obtuse, angles are approx. 34°, 106° and 40°)
If you stuck, this can help you: http://en.wikipedia.org/wiki/Law_of_cosines. But you can solve this kata even without angle calculation.
There is a very small chance of random test to fail due to round-off error, in such case resubmit your solution.
Quelle: codewars.com
Lösung
Pseudo-Code
OK, versuchen wir’s ohne Cosinus...
Wie immer gibt's reichlich Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Der Satz von Pythagoras könnte uns helfen, dafür müssen wir erst mal rauskriegen, welche der Seiten die Längste ist.
Schritt 2
Wenn die zwei kürzeren Seiten zusammen kürzer oder gleich lang sind als die längste Seite, kann es kein Dreieck ergeben. In diesem Fall können wir 0
zurückgeben.
Schritt 3
Wenn die Summe der Quadrate der beiden kürzeren Seiten größer ist als das Quadrat der längsten Seite, haben wir ein spitzwinkliges Dreieck und können 1
zurückgeben.
Schritt 4
Wenn die Summe der Quadrate der beiden kürzeren Seiten gleich dem Quadrat der längsten Seite ist, haben wir einen rechten Winkel (Satz von Pythagoras: c2 = a2 + b2). In diesem Fall können wir 2
zurückgeben.
Schritt 5
In allen anderen Fällen erhalten wir ein stumpfwinkliges Dreieck und geben 3
zurück.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function triangleType(a: number, b: number, c: number): number {
Als Erstes ermitteln wir die längste, mittlere und kürzeste Seite:
const [short, middle, long] = [a, b, c].sort((a, b) => a - b);
Wir stopfen alle Seiten in ein Array, sortieren es (aufsteigend) und deconstructen es in 3
Variablen.
Wenn die beiden kürzeren Seiten zusammen kürzer oder gleich lang wie die längste Seite sind, geben wir 0
zurück:
if (short + middle <= long) return 0;
Wenn die Summe der Quadrate der kürzeren Seiten größer ist als das Quadrat der längsten Seite geben wir 1
zurück:
if (short ** 2 + middle ** 2 > long ** 2) return 1;
Wenn die Summe der Quadrate der kürzeren Seiten gleich dem Quadrat der längsten Seite ist geben wir 2
zurück (Satz von Pythagoras):
if (short ** 2 + middle ** 2 === long ** 2) return 2;
In allen anderen Fällen geben wir 3
zurück:
return 3;
}
Voilá! 💪
Komplettlösung
export function triangleType(a: number, b: number, c: number): number {
const [short, middle, long] = [a, b, c].sort((a, b) => a - b);
if (short + middle <= long) return 0;
if (short ** 2 + middle ** 2 > long ** 2) return 1;
if (short ** 2 + middle ** 2 === long ** 2) return 2;
return 3;
}