Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Fizz Buzz |
Level: | 7 kyu |
Sprache: | JavaScript |
Beschreibung:
Return an array containing the numbers from 1 to N, where N is the parametered value.
Return a list containing the numbers from 1 to N, where N is the parametered value.
Replace certain values however if any of the following conditions are met:
- If the value is a multiple of 3: use the value "Fizz" instead
- If the value is a multiple of 5: use the value "Buzz" instead
- If the value is a multiple of 3 & 5: use the value "FizzBuzz" instead
N will never be less than 1.
Method calling example:
fizzbuzz(3) --> [1, 2, "Fizz"]
fizzbuzz(3) --> ["1", "2", "Fizz"]
fizzBuzz(3) --> ["1", "2", "Fizz"]
string[] result = FizzBuzz.GetFizzBuzzArray(3); // => [ "1", "2", "Fizz" ]
fizzify(3, [1, 2, "Fizz"]).
FizzBuzz.fizzify(3) // List("1", "2", "Fizz")
FizzBuzzArray.fizzBuzz(3) --> ["1", "2", "Fizz"]
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 erstellen wir uns ein Array, das genauso lang ist wie n
.
Schritt 2
Dann können wir durch dieses Array loopen.
Schritt 3
Wenn der Index des aktuellen Elements plus 1 durch 3 und 5 teilbar ist, geben wir 'FizzBuzz' zurück.
Wenn er nur durch 5 teilbar ist, geben wir nur 'Buzz' zurück.
Wenn er nur durch 3 teilbar ist, geben wir nur 'Fizz' zurück.
Schritt 4
Ansonsten geben wir den aktuellen Index plus 1 zurück.
Code
Geil. Übersetzen wir unseren Pseudo-Code in JavaScript:
Lösungsschritte
Meine erste Zeile:
function fizzbuzz(n) {
Dann erstellen wir uns das Array, das genauso lang ist wie n
:
return Array(n);
Das return
-Statement schreiben wir schon hierhin, denn hier kann man wunderbar chainen.
Darum füllen wir es jetzt mit (beliebigem) Inhalt:
.fill("x")
Ich entscheide mich für ein mysteriöses x
... Jetzt haben wir ein Array voll mit x
en!
(das ;
nach Array(n)
musst du dann natürlich entfernen, mein Editor fügt es leider automatisch hinzu...)
Jetzt der Loop:
.map((_, i) => {
Da wir am Ende genauso viele Elemente haben wollen wir am Anfang passt hier wunderbar ein .map()
Das erste Argument nennen wir _
, das ist Konvention für: 'Wir brauchen es nicht'.
Jetzt brauchen wir den aktuellen Index plus 1:
const curr = i + 1;
Jetzt nur noch die Bedingungen:
if (curr % 3 === 0 && curr % 5 === 0) return "FizzBuzz";
if (curr % 5 === 0) return "Buzz";
if (curr % 3 === 0) return "Fizz";
return curr;
});
}
Wer schlauer ist als ich, hat sich hier den Fakt zunutze gemacht, dass etwas das durch 3 und 5 teilbar ist, auch durch 15 teilbar ist. 😉
Voilá! 💪
Komplettlösung
function fizzbuzz(n) {
return Array(n)
.fill("x")
.map((_, i) => {
const curr = i + 1;
if (curr % 3 === 0 && curr % 5 === 0) return "FizzBuzz";
if (curr % 5 === 0) return "Buzz";
if (curr % 3 === 0) return "Fizz";
return curr;
});
}