Codewars Lösung | Fizz Buzz


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|10. Juli 2024
3 min.

Inhalt

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

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 xen!

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

Fragen?

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

Feedback

Schreib mir!