Christoph Grimmer-Dietrich

¿Hablas FizzBuzz?

Code Dojo

Es gibt unzählige - mehr oder eher weniger informative - Artikel zum Thema “Wie finde ich gute Softwareentwickler?". Sehr häufig kommt der Vorschlag, die Bewerberin eine Programmieraufgabe lösen zu lassen. Das Problem bei der Sache ist: Gute Entwicklerinnen lösen die Aufgabe potentiell mit Bravour, sind aber genervt und suchen sich vielleicht einen Arbeitgeber, der ihnen nicht die Zeit raubt. Im Netz kursiert seit einiger Zeit der “FizzBuzz-Test” - der ist kurz, anders und irgendwie witzig.

FizzBuzz?

Die Aufgabe ist denkbar einfach: Nimm die Zahlen von 1 bis 100. Ersetze die durch 3 teilbaren durch “Fizz”, die durch 5 teilbaren durch “Buzz” und die, die durch beides teilbar sind, durch “FizzBuzz”. Das richtige Ergebnis ist also

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz, 31, 32, Fizz, 34, Buzz, Fizz, 37, 38, Fizz, Buzz, 41, Fizz, 43, 44, FizzBuzz, 46, 47, Fizz, 49, Buzz, Fizz, 52, 53, Fizz, Buzz, 56, Fizz, 58, 59, FizzBuzz, 61, 62, Fizz, 64, Buzz, Fizz, 67, 68, Fizz, Buzz, 71, Fizz, 73, 74, FizzBuzz, 76, 77, Fizz, 79, Buzz, Fizz, 82, 83, Fizz, Buzz, 86, Fizz, 88, 89, FizzBuzz, 91, 92, Fizz, 94, Buzz, Fizz, 97, 98, Fizz, Buzz

Klingt simpel? Ist es eigentlich auch. Trotzdem scheinen sich viele schwer damit zu tun.

Die plumpe Lösung

Eine sehr einfache Lösung wäre

(1 .. 100).map { i -> 
    when {
        i % 3 == 0 && i % 5 == 0 -> "FizzBuzz"
        i % 3 == 0 -> "Fizz"
        i % 5 == 0 -> "Buzz"
        else -> i
    }
}

Unschön: Es wird doppelt geprüft, ob i durch 3 bzw 5 teilbar ist.

Die etwas elegantere Lösung

(1 .. 100).map { i -> 
    when {
        i % 15 == 0 -> "FizzBuzz"
        i % 3 == 0 -> "Fizz"
        i % 5 == 0 -> "Buzz"
        else -> i
    }
}

Zahlen, die durch 3 und 5 teilbar sind, sind natürlich auch durch 15 teilbar. Sieht schöner aus, ist aber im Prinzip nur mathematisch-syntaktischer Zucker.

Die “Ich prüfe beides nur einmal”-Lösung

Es geht natürlich auch anders.

(1 .. 100).map { i -> 
    when(i % 3) {
        0 -> i to "Fizz"
        else -> i to ""
    }
}.map { (i, j) -> 
    when(i % 5) {
        0 -> i to j + "Buzz"
        else ->i to j
    }
}.map { (i, j) -> 
    when(j) {
        "" -> i
        else -> j
    }
}

In dieser Lösung bilden wir im ersten map ein Tupel aus der Zahl und einem String (“Fizz” oder leer). Im zweiten map wird der String im Tupel wenn passend um “Buzz” ergänzt wodurch wir “", “Fizz”, “Buzz” oder “FizzBuzz” erhalten. Im letzten map wird der leere String durch die Zahl ersetzt. Fertig :-) Die Lösung basiert darauf, dass wir state erzeugen und uns das Ergebnis der Prüfungen merken.

Und wozu das Ganze?

Ich persönlich finde den Test eine nette Knobelei, die man im Prinzip am Whiteboard “programmieren” kann. Auf http://wiki.c2.com/?FizzBuzzTest gibt es eine Reihe weiterer Beispiele in unterschiedlichen Sprachen.

29 Jan 2019 #Bewerbungsgespräche #Kotlin #Assessment