Inhalt
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á! 💪
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];
}