Codewars Lösung | Handshake problem


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|3. April 2024
2 min.

Inhalt

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

Die Fakten:

Plattform:codewars.com
Name:Handshake problem
Level:6 kyu
Sprache:TypeScript

Beschreibung:

Johnny is a farmer and he annually holds a beet farmers convention "Drop the beet".

Every year he takes photos of farmers handshaking. Johnny knows that no two farmers handshake more than once. He also knows that some of the possible handshake combinations may not happen.

However, Johnny would like to know the minimal amount of people that participated this year just by counting all the handshakes.

Help Johnny by writing a function, that takes the amount of handshakes and returns the minimal amount of people needed to perform these handshakes (a pair of farmers handshake only once).

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

Wenn wir keine Handshakes haben, können wir 0 zurückgeben.

Schritt 2

Ansonsten könnten wir z.B. durch die Anzahl der Personen loopen.

Schritt 3

Wir fangen bei einer Person an und testen, ob die Summe aller Handshakes größer oder gleich der Input-Handshakes ist.

Schritt 4

Wenn ja, können wir die Anzahl der Personen zurückgeben.

Schritt 5

Wenn nicht, die aktuelle Anzahl Personen zur Summe der Handshakes hinzufügen.

Code

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

Lösungsschritte
Meine erste Zeile:
export function getParticipants(handshakes: number): number {
Zuerst der Fall ohne Handshakes:
if (!handshakes) return 0;

Wenn es keine Handshakes gibt, geben wir 0 zurück.

Dann initialisieren wir unsere Handshakes-Summe:
let sumHandshakes = 0;
Jetzt der Loop:
  for (let numPeople = 1; ; numPeople++) {

Ich entscheide mich hier für einen (unendlichen) for...of-Loop. Also ohne Bedingung. Du kannst hier auch gerne while verwenden.

Dann unser Test:
if (sumHandshakes >= handshakes) return numPeople;

Wenn die Summe aller Handshakes größer oder gleich der Input-Handshakes wird, können wir die Anzahl der Personen zurückgeben und damit Funktion und Loop beenden.

Ansonsten fügen wir die aktuelle Anzahl Personen zur Summe der Handshakes hinzu:
    sumHandshakes += numPeople;
  }
}
Voilá! 💪

Fragen?

Komplettlösung
export function getParticipants(handshakes: number): number {
  if (!handshakes) return 0;

  let sumHandshakes = 0;

  for (let numPeople = 1; ; numPeople++) {
    if (sumHandshakes >= handshakes) return numPeople;
    sumHandshakes += numPeople;
  }
}

Feedback

Schreib mir!