Python ile “FizzBuzz” Mülakat Sorusu Çözümü
Yazılım sektöründe işe alım sürecinde sıkça karşılaşılan ve adayların algoritma bilgilerini ölçmeye yarayan klasik bir problem olan FizzBuzz problemi üzerinde duracağız. Problem, ilk bakışta oldukça basit gibi görünse de, çözüm aşamasında dikkat gerektiren önemli detaylar içerir. Biz bu yazımızda, Python programlama dili ile FizzBuzz mülakat sorusu nasıl çözülebileceğine dair adımları anlatacağız. Öncelikle sorumuzu tanıtalım:
- Programınız sırayla 1’den 100’e kadar her sayıyı yazdırmalıdır.
- Sayı eğer 3’e bölünebiliyorsa, (örneğin; 3) sayıyı yerine “Fizz” yazdırın.
- Sayı eğer 5’e bölünebiliyorsa, (örneğin; 5) sayıyı yerine “Buzz” yazdırın.
- Sayı eğer hem 3’e hem de 5’e bölünebiliyorsa, (örneğin; 15) sayıyı yazdırmak yerine “FizzBuzz” yazmalıdır.
Evet, FizzBuzz böyle bir soru. Şimdi bu kuralları baz alarak yaklaşımımızı adım adım yazalım ve temsili bir akış şeması çizelim. Bakınız:
- Adım 1: Başla
- Adım 2: 1’den 101’e kadar olan sayılar üzerinde bir döngü başlat.
- Adım 3: Her döngüde, şu kontrol et:
- Eğer sayı hem 3’e hem de 5’e tam bölünüyorsa, “FizzBuzz” yazdır.
- Eğer sayı sadece 3’e tam bölünüyorsa, “Fizz” yazdır.
- Eğer sayı sadece 5’e tam bölünüyorsa, “Buzz” yazdır.
- Eğer sayı 3’e veya 5’e tam bölünmüyorsa, sayıyı yazdır.
- Adım 4: Döngü tamamlandığında, programı bitir.
- İlk çözümümüzde tekrarlı bir iş olduğu için for döngüsü kullanılacaktır. Ayrıca koşul durumu belirtildiği için if-elif-else ifadelerini ve and operatörünü kullanacağız.
1 2 3 4 5 6 7 8 9 |
for i in range(1, 101): if i % 3 == 0 and i % 5 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i) |
Kodu çalıştırmak için: Trinket
Çözümde anahtar nokta, “if-elif-else” kod bloğunun doğru sırayla düzenlenmesidir. Bir koşul sağlandığında, ilgili kod bloğu çalıştırılır ve diğer koşullar kontrol edilmez. Bu nedenle, hem 3’e hem de 5’e bölünebilme koşulunu en başta kontrol etmek kritik bir öneme sahiptir. Eğer 3’e bölünebilme veya 5’e bölünebilme koşullarından biri en başta kontrol edilirse, program hem 3’e hem de 5’e bölünebilme koşulunu kontrol etmeden sonlanır. Bu durumda, program istenmeyen sonuçlar üretir ve bu da hatalı bir çözüm olur.
- İkinci çözümümüzde ise for döngüsü yerine while döngüsü kullanılacaktır. Ayrıca benzer şekilde if-elif-else ifadeleri de kullanılmıştır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
sayi = 1 while sayi < 101: if sayi % 3 == 0 and sayi % 5 == 0: print ("FizzBuzz") elif sayi % 3 == 0: print ("Fizz") elif sayi % 5 == 0: print ("Buzz") else: print (sayi) sayi += 1 |
Kodu çalıştırmak için: Trinket
- Üçüncü çözümümüzde ise for döngüsü, çoklu if deyimi ile çözülecektir:
1 2 3 4 5 6 7 8 9 |
for sayi in range(1,101): string = "" if sayi%3 == 0: string += "Fizz" #string = string + "Fizz" if sayi%5 == 0: string += "Buzz" #string = string + "Buzz" if sayi%5 != 0 and sayi%3 != 0: string += str(sayi) #string = string + str(sayi) print(string) |
Yukarıdaki çözümde “for döngüsü” içinde “çoklu if” yapısı kullanılmıştır. Bu, bir koşul sağlansa bile diğer koşulların da kontrol edileceği anlamına gelir. Bu nedenle, 3’e bölünebilme durumu ilk koşul olarak belirlenmiştir.
Son koşula gelindiğinde, sayının hem 5’e hem de 3’e tam bölünemeyen durumlar için, döngüdeki sayı değeri string’e eklenir.
Eğer bir sayı hem 3’e hem de 5’e bölünebiliyorsa, öncelikle 3’e bölünebildiği için ‘string’ değeri “Fizz” olur. Daha sonra, bu ‘string’ değeri “Buzz” ile birleştirilir ve sonuç “FizzBuzz” olarak elde edilir.
Bu versiyonumuz, her sayı için 3 kontrol yapar ve sonucu string değişkenine ekler, sonra string’i yazdırır. Haliyle, önceki çözümlere göre daha düzenli ve okunabilir bir yaklaşım sağlar. Kodu çalıştırmak için: Trinket