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.