Zum Inhalt springen

tuerchen 03 · 3. Dezember

FizzBuzzHo

Code-GolfLeichtPHP 8.4

Aufgabe

FizzBuzz kennt jeder. Der Weihnachtsmann hat es erweitert – und will es so kurz wie möglich.

Schreibe function x($n), die einen String mit den Zahlen 1 bis $n liefert, getrennt durch ein Leerzeichen. Dabei gilt:

  • durch 3 teilbar → Fizz
  • durch 5 teilbar → Buzz
  • durch 7 teilbar → Ho
  • mehrere Teiler → Wörter in genau dieser Reihenfolge aneinander (FizzBuzz, FizzHo, BuzzHo, FizzBuzzHo)
  • sonst die Zahl selbst

Für $n = 0 gibt es den leeren String. Kein Leerzeichen am Anfang oder Ende. Die Funktion muss x heißen und einen String zurückgeben.

Gewertet wird die Zeichenzahl deines Codes (ohne <?php und ohne Leerraum am Ende). Kürzer ist besser – alle Tests müssen trotzdem grün sein. Warnungen und Deprecations zählen als Fehler (die Tests wandeln sie in Ausnahmen um), schlampiges Golf fliegt also raus.

Sichtbare Tests

  • Die ersten 15

    set_error_handler(function (int $no, string $msg) { throw new ErrorException($msg, 0, $no); });
    echo x(15);

    Erwartet: 1 2 Fizz 4 Buzz Fizz Ho 8 Fizz Buzz 11 Fizz 13 Ho FizzBuzz

  • Bis 21 mit FizzHo

    set_error_handler(function (int $no, string $msg) { throw new ErrorException($msg, 0, $no); });
    echo implode(' ', array_slice(explode(' ', x(21)), -3));

    Erwartet: 19 Buzz FizzHo

  • Nur die 1

    set_error_handler(function (int $no, string $msg) { throw new ErrorException($msg, 0, $no); });
    echo json_encode(x(1));

    Erwartet: "1"

Dazu kommen 7 versteckte Tests, die nur beim Abgeben laufen.

Tipp anzeigenkostet keine Punkte

Prüf die Teiler der Reihe nach und hänge die Wörter aneinander. Erst wenn danach nichts dasteht, kommt die Zahl.

Gezählt wird: Zeichen ohne <?php und ohne abschließende Leerzeichen/Zeilenumbrüche

Extra-Stufe (+5 Punkte, freiwillig)

Extra-Stufe (+5): Auch negative $n funktionieren: Dann zählst du von -1 abwärts bis $n, mit denselben Regeln (-3 ist durch 3 teilbar). x(-5) ergibt -1 -2 Fizz -4 Buzz. Gewertet wird weiter die Zeichenzahl deines ganzen Codes.

Kein zweiter Editor: Dein Code oben zählt für beides. Die Extra-Tests laufen mit jeder Abgabe (4 Tests).

Mitraten geht mit deinem kostenlosen Entwicklerkonto

Lesen darf jeder. Punkte, Bestenliste und Preise gibt es nur mit Konto.

Auflösung

Die Basis-Referenz ohne Extra-Stufe (119 Zeichen) nutzt drei Golf-Tricks:

  • $i%3?'':'Fizz' – ein Rest ungleich 0 ist truthy, also leerer String.
  • Der Elvis-Operator ?: liefert die Zahl, wenn die Wort-Verkettung leer (falsy) ist.
  • for($s='',$i=0;$i++<$n;) initialisiert alles im Schleifenkopf, und trim() entfernt das führende Leerzeichen am Ende auf einen Schlag.
function x($n){for($s='',$i=0;$i++<$n;)$s.=' '.(($i%3?'':'Fizz').($i%5?'':'Buzz').($i%7?'':'Ho')?:$i);return trim($s);}

Die Musterlösung unten löst zusätzlich die Extra-Stufe (negative $n, 128 Zeichen).

Fallen: Ohne Anführungszeichen (Fizz als nackte Konstante) gibt es seit PHP 8 einen Error. Und $s vorher nicht zu initialisieren erzeugt bei jedem Aufruf eine Warnung (Undefined variable $s) – die Tests werten sie als Fehler, bei $n = 0 kommt zusätzlich eine Deprecation für trim(null).

Musterlösung

<?php function x($n){for($s='',$i=0;$i!=$n;)$s.=' '.((($i+=$n<=>0)%3?'':'Fizz').($i%5?'':'Buzz').($i%7?'':'Ho')?:$i);return trim($s);}

Zurück zum Kalender