Hi there!

My name is Moritz Zwerger, aka Bixilon

Software developer from Munich

Feel free to send me something nice:

Deutsch

FizzBuzz

Back to main
Ein simples Programmierrätsel, wo es ∞ Lösungsmöglichkeiten gibt

Gestern Abend ist mir aus heiterem Himmel ein kleines Programmierrätsel eingefallen: FizzBuzz: "Fizz buzz ist ein Gruppen-Wortspiel für Kinder, das ihnen etwas über die mathematische Division beibringen soll.[1] Die Spieler zählen abwechselnd inkremental, wobei jede durch drei teilbare Zahl durch das Wort „Fizz“ und jede durch fünf teilbare Zahl durch das Wort „Buzz“ ersetzt wird" - Quelle: wikipedia


Die Anforderungen waren relativ strikt: Es muss funktionieren und der Code sollte Qualitativ hochwertig sein. Zeit ist egal, Programmiersprache ist egal. Ich persönlich habe mich für Python entschieden, da ich es extrem effizient für Miniprogramme finde. Niggl hat sich für JavaScript entscheiden und Norman für Java.

Das Ergebnis ist bei allen gleich, allerdings sieht der Code komplett anders aus. Was gleich ist, ist das jeder einen Loop von 0 bis 100 macht. Bei Norman und Niggl finde ich den Code an manchen Stellen relativ eindeutig und einfach zu erklären. Erst überprüfen, ob durch 5 und 3 teilbar ist, dann FizzBuzz schreiben und weitermachen. Anschließend durch 5 telibar und dann 3. Niggl hat das schöner mit else if gelöst, Norman hat doppeln überprüft: Durch 3 und nicht 5. Problem an dem ganzen ist: Wass ist wenn wir jetzt Tizz bei modulo 7 hinzufügen? Wir müssten nach Fizz, Buzz, Tizz, FizzBuzz, FizzTizz, BuzzTizz überprüfen. Das sind schonmal nich nur 3 checks, sondern 6, wenn ich nichts vergessen habe :). Außerdem sind die Zeilen  else if (i % 3 == 0) { und message = message + "Fizz" + "\n"; gleich, mit dem einzigen Unterschied, dass die Werte anders sind.

Lukas und ich haben gleich begonnen oben mit einem Mapping. Bei 3 wird es Fizz und bei 5 wird es Buzz. Lukas hat das per Tupel umgesetzt, ich gleich durch ein dictionary (eine Art Map). Anschließend im Loop (0-100) durch jede Zahl im dict durchgeloopt und geschaut. Falls der Rest durch die Zahl 0 war (kurz: teilbar), an einen output String das dementsprechende Wort angehängt. Nach dem 2. Loop noch ein Check, ob "output" leer ist. Falls ja, ist output jetzt die Zahl (i). Jetzt noch ein print Statement und die Zahl ausgeben


Lerneffekt

Man sieht, wenn man den Code gemeinsam durchgeht und den anderen erklärt, meistens Schwachstellen. Bei dem ganze if else Zeug, merkt man schnell, dass man an mehreren Stellen eine Zahl austauschen muss, wenn man statt 3 6 nimmt. Ich finde, man kann daraus eine heilige Programmierregel ableiten: Werte, immer als Konstante definieren, an einer Stelle! Auch sollte man Zeilen niemals doppelnd schreiben!