(note (code cslai))

Revisiting Fizz Buzz in PHP

Back then when I was attending a job interview, I was asked to write a Fizz Buzz program to prove that my coding ability. There was only a pen and a piece of paper, so basically means there’s no way I can refer to the documentation for the API syntax. Fortunately I somehow managed to remember and not screw up.

I didn’t know anything about the program, so the interviewer had to explain what he expects from the program. If I recall correctly, the problem was defined as given a list of integers from 1 to 50, print a ‘fizz’ if the number is a multiple of 3, and ‘buzz’ if 5 divides the number. I think my solution to the problem back then was rather simple, like this


<?php
 
for($i = 1; $i <= 50; $i++) {
    echo "$i ";
 
    if($i % 3 == 0 AND $i % 5 == 0) {
        echo 'fizz buzz';
    } else if($i % 3 == 0) {
        echo 'fizz';
    } else if($i % 5 == 0) {
        echo 'buzz';
    }
}

The interviewer back then apparently somehow satisfied, but he then told me it is possible to make it a one liner. While I was impressed, but I didn't really bother to find out at the time, it is just a trivial programming puzzle anyway, no? However, from time to time, I do think about the possibility.

Years later, a couple of days earlier I came across a random status posted by an ex-colleague of mine (iirc). I think the post was about implementing Fizz Buzz in golang, but I didn't really bother to read the article. While continue browsing through the timeline, I started thinking if I am to code a solution to this problem these days, how would I do it?

I started picking up habit to do a lot of array_map() and array_reduce() instead of traditional loop, back when I was nearing the end of my first job. Then while I was working on my now nearly abandoned research project I picked up Clojure to see if it is a practical tool to do data manipulation. While I decided to stick with PHP for the data manipulation task, the idea of doing it the functional way somehow stuck. And co-incidentally, PHP finally implemented a somehow more useful anonymous function syntax (no more create_function() for goodness sake).

So while I didn't bother to read the actual article about fizz buzz in golang, I decided to re-write fizz buzz in PHP the (pseudo-)functional way. The resulting code is shown below

#!/usr/bin/env php
<?php
 
array_walk(
    range(1, 50),
    function($number, $key, Closure $processor) {
        printf(
            '%s %s%s',
            $number,
            trim(implode(
                ' ',
                array_map(
                    function(Closure $printer) use($number) {
                        return call_user_func($printer, $number);
                    },
                    array(
                        call_user_func($processor, 3, 'fizz'),
                        call_user_func($processor, 5, 'buzz'))))),
            PHP_EOL
        );
    },
    function($divisor, $output) {
        return function($number) use($divisor, $output) {
            return $number % $divisor == 0 ? $output : NULL;
        };
    });

While it has a lot more line count, and is considerably longer (and more inefficient), but I think I like this version better. The only problem beside it being inefficient, and longer, is that there's no way I can write this without the aid of documentation. I mean who would remember (OK, I won't) the syntax difference between array_walk(), array_map(), array_filter() and array_reduce() etc.

Guess I should just stick with the first one if I am asked again in another job interview in future.

Exit mobile version