Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Cats and shelves |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
Description
An infinite number of shelves are arranged one above the other in a staggered fashion.
The cat can jump either one or three shelves at a time: from shelf i
to shelf i+1
or i+3
(the cat cannot climb on the shelf directly above its head), according to the illustration:
┌────────┐
│-6------│
└────────┘
┌────────┐
│------5-│
└────────┘ ┌─────► OK!
│ ┌────────┐
│ │-4------│
│ └────────┘
┌────────┐ │
│------3-│ │
BANG!────┘ ├─────► OK!
▲ |\_/| │ ┌────────┐
│ ("^-^) │ │-2------│
│ ) ( │ └────────┘
┌─┴─┴───┴┬──┘
│------1-│
└────────┘
Input
Start and finish shelf numbers (always positive integers, finish no smaller than start)
Task
Find the minimum number of jumps to go from start to finish
Example
Start 1
, finish 5
, then answer is 2
(1 => 4 => 5 or 1 => 2 => 5)
Inspirers
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
Ich entscheide mich das mit einem Loop zu lösen.
Schritt 2
Für jeden Sprung wird ein Counter um 1
erhöht.
Schritt 3
Wenn die aktuelle Position +3
kleiner oder gleich dem Ziel ist, mach das.
Schritt 4
Sonst, mach aktuelle Position +1
.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function solution(start: number, finish: number): number {
Den Sprung-Counter definieren:
let numJumps = 0;
Die aktuelle Position definieren:
let currPos = start;
Als Nächstes kommt der Loop.
Wir wollen solange hüpfen, bis das Ziel erreicht ist:
while (currPos < finish) {
Erstmal den Sprungzähler um 1
erhöhen:
numJumps++;
Jetzt prüfen wir, ob die aktuelle Position +3
kleiner/gleich dem Ziel ist:
if (currPos + 3 <= finish) {
Wenn ja, addieren wir 3
zur aktuellen Position und springen zum nächsten Durchlauf:
currPos += 3;
continue;
}
continue
ist
eines meiner Lieblings-Keywords!
Wenn nicht, addieren wir nur 1
zur aktuellen Position:
currPos++;
}
Nach dem Loop nicht vergessen den Sprungzähler auszugeben:
return numJumps;
}
Voilá! 💪
Komplettlösung
export function solution(start: number, finish: number): number {
let numJumps = 0;
let currPos = start;
while (currPos < finish) {
numJumps++;
if (currPos + 3 <= finish) {
currPos += 3;
continue;
}
currPos++;
}
return numJumps;
}