Codewars Lösung | Cats and shelves


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|25. November 2023
2 min.

Inhalt

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

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

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

Fragen?

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

Feedback

Schreib mir!