Codewars Lösung | Triangle type


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|10. März 2024
3 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

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).

Acute
Right
Obtuse

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á! 💪

Fragen?

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;
}

Feedback

Schreib mir!