🔥 Zapisy zamknięte, ale możesz pobrać Roadmapę .NET i dołączyć do listy oczekujących — Pobierz i dołącz do Listy VIP →

FizzBuzz — Zadanie rekrutacyjne #1

Czego szuka rekruter: rozumienie operatora modulo, warunki złożone, kolejność sprawdzania warunków
Poziom: Junior


Zadanie

Napisz funkcję, która dla liczby całkowitej n zwraca:

  • "FizzBuzz" jeśli n jest podzielne przez 3 i przez 5
  • "Fizz" jeśli n jest podzielne przez 3
  • "Buzz" jeśli n jest podzielne przez 5
  • string z liczbą w pozostałych przypadkach

Wyświetl wyniki dla liczb 1–100.


Czego szuka rekruter

FizzBuzz nie jest testem wiedzy o operatorze modulo — to test myślenia. Rekruter patrzy na:

  • Kolejność warunków — czy kandydat sprawdza % 15 przed % 3 i % 5 (lub buduje string kumulatywnie)
  • Czytelność% 15 vs % 3 == 0 && % 5 == 0
  • Ekstrakcja do metody — czy kandydat wydziela logikę z pętli
  • Rozszerzalność — co gdyby dodać “Jazz” dla 7?

Najczęstszy błąd: sprawdzanie % 3 i % 5 osobno i pisanie "Fizz" + "Buzz" bez sprawdzenia % 15 — co i tak daje "FizzBuzz", ale drugi if nadpisuje wynik jeśli kandydat użył else if.


Edge cases do przemyślenia

  • n = 0 — podzielne przez wszystko (0 % n == 0 dla każdego n > 0)
  • liczby ujemne — -15 też jest podzielne przez 15
  • n = 1 — żadna z reguł

Rozwiązanie

static string FizzBuzz(int n)
{
    // Budowanie stringa kumulatywnie — rozszerzalne
    var result = string.Empty;
    
    if (n % 3 == 0) result += "Fizz";
    if (n % 5 == 0) result += "Buzz";
    
    return result.Length > 0 ? result : n.ToString();
}

// Użycie:
for (int i = 1; i <= 100; i++)
    Console.WriteLine(FizzBuzz(i));

Alternatywa — ternary (czytelna, ale mniej rozszerzalna)

static string FizzBuzz(int n) =>
    n % 15 == 0 ? "FizzBuzz" :
    n % 3  == 0 ? "Fizz" :
    n % 5  == 0 ? "Buzz" :
    n.ToString();

Alternatywa — LINQ (na rozmowie rekrutacyjnej można pokazać jako bonus)

var output = Enumerable.Range(1, 100).Select(FizzBuzz);
foreach (var line in output)
    Console.WriteLine(line);

Testy jednostkowe

[Theory]
[InlineData(1,   "1")]
[InlineData(3,   "Fizz")]
[InlineData(5,   "Buzz")]
[InlineData(15,  "FizzBuzz")]
[InlineData(30,  "FizzBuzz")]
[InlineData(100, "Buzz")]
[InlineData(99,  "Fizz")]
public void FizzBuzz_ReturnsCorrectValue(int input, string expected)
{
    Assert.Equal(expected, FizzBuzz(input));
}

Co powiedzieć na rozmowie

“Wersja kumulatywna z dwoma osobnymi if jest lepsza niż if/else if z % 15, bo łatwiej ją rozszerzyć — gdyby trzeba było dodać 'Jazz' dla 7, wystarczy dołożyć jeden if (n % 7 == 0) result += 'Jazz' bez przepisywania całej logiki.”


Podsumowanie

PodejścieZaletyWady
Kumulatywny stringRozszerzalny, brak % 15Nieco mniej oczywisty
Ternary % 15ZwięzłyTwardokodowane reguły
LINQFunkcyjny stylOverhead dla prostego zadania
👨‍💻
Mariusz Jurczenko
Senior .NET Developer · 10+ lat doświadczenia komercyjnego

Programista .NET z doświadczeniem komercyjnym w firmach takich jak COIG, Kamsoft czy Etisoft Smart Solutions. Twórca kursów, z których skorzystało już ponad 11 000 osób w Strefie Kursów i ponad 1 000 kursantów na dev-hobby.pl.

Specjalizacja: Clean Code, Clean Architecture i uczenie programowania tak, żeby dało się je naprawdę zrozumieć — nie wykuć.

9 comments

  1. Oto moje rozwiązanie
    for (int i = 1; i <= 100; i++)
    {
    if (i % 3 == 0 && i % 5 == 0)
    {
    Console.WriteLine("FizzBuzz");
    }
    else if (i % 3 == 0)
    {
    Console.WriteLine("Fizz");
    }
    else if (i % 5 == 0)
    {
    Console.WriteLine("Buzz");
    }
    else
    {
    Console.WriteLine(i);
    }
    }

  2. Bardzo częste zadanie rekrutacyjne, moje rozwiązanie
    for (int i = 1; i <= 100; i++)
    {
    if (i % 15 == 0)
    Console.WriteLine("FizzBuzz");
    else if (i % 3 == 0)
    Console.WriteLine("Fizz");
    else if (i % 5 == 0)
    Console.WriteLine("Buzz");
    else
    Console.WriteLine(i);
    }

  3. for (int i = 1; i <= 100; i++)
    {
    string res = (i % 3 == 0 && i % 5 == 0) ? "FizzBuzz" :
    (i % 3 == 0) ? "Fizz" :
    (i % 5 == 0) ? "Buzz" :
    i.ToString();

    Console.WriteLine(res);
    }

  4. ja tez mam rozwiazanie
    private static void DoFizzBuzz()
    {
    for (int i = 1; i <= 100; i++)
    {
    bool fizz = i % 3 == 0;
    bool buzz = i % 5 == 0;
    if (fizz && buzz)
    Console.WriteLine("FizzBuzz");
    else if (fizz)
    Console.WriteLine("Fizz");
    else if (buzz)
    Console.WriteLine("Buzz");
    else
    Console.WriteLine(i);
    }
    }

Dodaj komentarz

czytanie to początek

Zamień wiedzę w umiejętności

Pobierz darmową Roadmapę .NET i ułóż takie tematy jak ten w spójną ścieżkę do pierwszej pracy.

Pobieram roadmapę →