
Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | English beggars |
Level: | 6 kyu |
Sprache: | JavaScript |
Beschreibung:
Born a misinterpretation of this kata, your task here is pretty simple: given an array of values and an amount of beggars, you are supposed to return an array with the sum of what each beggar brings home, assuming they all take regular turns, from the first to the last.
For example: [1,2,3,4,5]
for 2
beggars will return a result of [9,6]
, as the first one takes [1,3,5]
, the second collects [2,4]
.
The same array with 3
beggars would have in turn have produced a better out come for the second beggar: [5,7,3]
, as they will respectively take [1,4]
, [2,5]
and [3]
.
Also note that not all beggars have to take the same amount of "offers", meaning that the length of the array is not necessarily a multiple of n
; length can be even shorter, in which case the last beggars will of course take nothing (0
).
Note: in case you don't get why this kata is about English beggars, then you are not familiar on how religiously queues are taken in the kingdom ;)
Note 2: do not modify the input array.
Quelle: codewars.com
Lösung
Pseudo-Code
Es gibt wie immer viele Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Zuerst schauen wir, ob wir überhaupt Bettler haben.
Schritt 2
Wenn nicht, geben wir ein leeres Array zurück.
Schritt 3
Ansonsten erstellen wir uns ein Outcomes-Array, in dem wir die Ergebnisse für jeden Bettler speichern.
Schritt 4
Außerdem brauchen wir eine Bettler-Variable.
Schritt 5
Dann der Loop.
Schritt 6
Wir addieren den jeweils aktuellen Wert im values
-Array zu dem aktuellen Bettler.
Schritt 7
Dann müssen wir zum nächsten Bettler wechseln.
Schritt 8
Und nach dem Loop alles noch brav zurückgeben.
Code
Geil. Übersetzen wir unseren Pseudo-Code in JavaScript:
Lösungsschritte
Meine erste Zeile (ich habe values
und n
in earnings
und numBeggars
umbenannt):
function beggars(earnings, numBeggars) {
Zuerst der Check, ob es überhaupt Bettler gibt:
if (!numBeggars) return [];
Dann unser Outcomes-Array und die Bettler-Variable:
const outcomes = Array(numBeggars).fill(0);
let beggar = 0;
Unser outcomes
-Array wird genauso lang, wie wir Bettler haben. Wir füllen es erst mal mit Nullen.
Um durch die Bettler zu switchen brauchen wir eine Variable für den Index des jeweils aktuellen Bettlers. Der erste ist 0
.
Dann der Loop durch die Einkommen (earnings
):
earnings.forEach((earning, i) => {
Wir suchen uns den passenden Bettler raus und erhöhen sein Einkommen um 1
:
outcomes[beggar] += earning;
Dann wechseln wir zum nächsten Bettler:
beggar++;
Wenn wir den letzten Bettler erreicht haben, wechseln wir wieder zum ersten:
if (beggar === numBeggars) beggar = 0;
});
Alternativ kannst du hier auch gerne den Remainder/Modulo-Operator (%
) verwenden.
beggar = beggar % numBeggars
});
Zum Schluss nur noch die Ergebnisse zurückgeben:
return outcomes;
}
Voilá! 💪
Komplettlösung
function beggars(earnings, numBeggars) {
if (!numBeggars) return [];
const outcomes = Array(numBeggars).fill(0);
let beggar = 0;
earnings.forEach((earning, i) => {
outcomes[beggar] += earning;
beggar++;
if (beggar === numBeggars) beggar = 0;
});
return outcomes;
}