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