Codewars Lösung | Tortoise racing


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|6. 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:Tortoise racing
Level:6 kyu
Sprache:TypeScript

Beschreibung:

Two tortoises named A and B must run a race. A starts with an average speed of 720 feet per hour. Young B knows she runs faster than A, and furthermore has not finished her cabbage.

When she starts, at last, she can see that A has a 70 feet lead but B's speed is 850 feet per hour. How long will it take B to catch A?

More generally: given two speeds v1 (A's speed, integer > 0) and v2 (B's speed, integer > 0) and a lead g (integer > 0) how long will it take B to catch A?

The result will be an array [hour, min, sec] which is the time needed in hours, minutes and seconds (round down to the nearest second) or a string in some languages.

If v1 >= v2 then return nil, nothing, null, None or {-1, -1, -1} for C++, C, Go, Nim, Pascal, COBOL, Erlang, [-1, -1, -1] for Perl,[] for Kotlin or "-1 -1 -1" for others.

Examples:

(form of the result depends on the language)

race(720, 850, 70) => [0, 32, 18] or "0 32 18"
race(80, 91, 37)   => [3, 21, 49] or "3 21 49"

Note:

  • See other examples in "Your test cases".

  • In Fortran - as in any other language - the returned string is not permitted to contain any redundant trailing whitespace: you can use dynamically allocated character strings.

** Hints for people who don't know how to convert to hours, minutes, seconds:

  • Tortoises don't care about fractions of seconds
  • Think of calculation by hand using only integers (in your code use or simulate integer division)
  • or Google: "convert decimal time to hours minutes seconds"

Quelle: codewars.com

Lösung

Pseudo-Code

Wie immer gibt's reichlich Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht’s:

Lösungsschritte
Schritt 1

Als Erstes fangen wir die Fälle ab, in denen 🐢 A schneller (oder gleich schnell) als 🐢 B, und damit uneinholbar ist.

Schritt 2

Dann berechnen wir den Geschwindigkeitsunterschied.

Schritt 3

Diesen können wir verwenden um die Zeit zu berechnen.

Schritt 4

Diese Zeit wandeln wir dann noch in Stunden, Minuten und Sekunden um.

Code

Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:

Lösungsschritte
Meine erste Zeile:
export function race(v1: number, v2: number, g: number): [number, number, number] | null {
Erst die Fälle abfangen in denen 🐢 A schneller als 🐢 B ist:
if (v1 >= v2) return null;
Jetzt berechnen wir den Geschwindigkeitsunterschied:
const speedDiff = v2 - v1;
Danach die können wir leicht die Gesamtzeit in Stunden berechnen:
const durationInHrs = g / speedDiff;
Mit Sekunden lässt es sich leichter rechnen, darum wandele ich mir die Stunden in Sekunden um:
const durationInSecs = durationInHrs * 3600;
Jetzt können wir die Ausgabewerte berechnen. Als Erstes die Stunden:
const hrs = Math.trunc(durationInHrs);

Da wir oben schon die Stunden berechnet haben, brauchen wir von diesem Wert nur noch alles nach dem Komma zu entfernen.

Jetzt die Minuten:
const mins = Math.trunc(durationInSecs / 60) % 60;
Last but not least - die Sekunden:
const secs = Math.trunc(durationInSecs % 60);
Zum Schluss alles nur noch als Array zurückgeben:
  return [hrs, mins, secs];
}
Voilá! 💪

Fragen?

Komplettlösung
export function race(
  v1: number,
  v2: number,
  g: number,
): [number, number, number] | null {
  if (v1 >= v2) return null;

  const speedDiff = v2 - v1;
  const durationInHrs = g / speedDiff;
  const durationInSecs = durationInHrs * 3600;

  const hrs = Math.trunc(durationInHrs);
  const mins = Math.trunc(durationInSecs / 60) % 60;
  const secs = Math.trunc(durationInSecs % 60);

  return [hrs, mins, secs];
}

Feedback

Schreib mir!