Fizz Buzz
There is a rather simple problem that sometimes is asked in job interviews:
Print out the numbers from 1 to 100. If the number if divisible by 3, print "Fizz" instead of the numbers. If the number is divisible by 5, print "Buzz". And if it is divisible by both, print "FizzBuzz".
This is not a particularly hard problem, but it shows control structures like looks and branches. I have implemented it in various programming languages to see how different they are.
Bash
Integer arithmetics is built-in to Bash, though it is not exactly pretty.
set -e set -u for (( i = 1; i <= 100; ++i )); do local printed=false if (( i % 3 == 0 )); then echo -n 'Fizz' printed=true fi if (( i % 5 == 0 )); then echo -n 'Buzz' printed=true fi if [[ "$printed" == false ]]; then echo -n $i fi echo done
C++
#include <iostream> int main() { for (int i = 1; i <= 100; ++i) { bool printed = false; if (i % 3 == 0) { std::cout << "Fizz"; printed = true; } if (i % 5 == 0) { std::cout << "Buzz"; printed = true; } if (!printed) { std::cout << i; } std::cout << "\n"; } }
C
#include <stdio.h> int main() { for (int i = 1; i <= 100; ++i) { int printed = 0; if (i % 3 == 0) { printf("Fizz"); printed = 1; } if (i % 5 == 0) { printf("Buzz"); printed = 1; } if (!printed) { printf("%d", i); } printf("\n"); } }
Fish
The syntax of Fish is a tad easier than the one of Bash, but it makes the
program more complicated. Especially all those calls to bc
make it hard to
read.
for i in (seq 1 100) set printed false if test (echo "$i % 3" | bc) -eq 0 echo -n 'Fizz' set printed true end if test (echo "$i % 5" | bc) -eq 0 echo -n 'Buzz' set printed true end if test "$printed" != true echo -n "$i" end echo end
Haskell
Haskell has neither variables or loops. However, if you can read some of the syntax, it actually is the prettiest implementation.
fizzbuzz :: Int -> String fizzbuzz i | i `mod` 3 == 0 && i `mod` 5 == 0 = "FizzBuzz" | i `mod` 3 == 0 = "Fizz" | i `mod` 5 == 0 = "Buzz" | otherwise = show i join :: [[Char]] -> [Char] join [x] = x join (x:xs) = x ++ "\n" ++ join xs main = putStrLn $ join $ map fizzbuzz [1..100]
Java
For some reasons everything has to be a class in Java.
public class FizzBuzz { public static void main(String[] args) { for (int i = 1; i <= 100; ++i) { boolean printed = false; if (i % 3 == 0) { System.out.print("Fizz"); printed = true; } if (i % 5 == 0) { System.out.print("Buzz"); printed = true; } if (!printed) { System.out.print(i); } System.out.println(); } } }
JavaScript
In JavaScript, one has to prefix variables with var
such that they do not
become global. Whatever ...
for (var i = 1; i <= 100; ++i) { var printed = false; if (i % 3 == 0) { print("Fizz"); printed = true; } if (i % 5 == 0) { print("Buzz"); printed = true; } if (!printed) { print(i); } print("\n"); }
PHP
<?php for ($i = 1; $i <= 100; ++$i) { $printed = false; if ($i % 3 == 0) { echo 'Fizz'; $printed = true; } if ($i % 5 == 0) { echo 'Buzz'; $printed = true; } if (!$printed) { echo "$i"; } echo "\n"; }
Python
This is rather nice procedural code:
for i in range(1, 101): printed = False if i % 3 == 0: print('Fizz', end='') printed = True if i % 5 == 0: print('Buzz', end='') printed = True if not printed: print(i, end='') print()
R
R is not exactly made for this, but it can also do it.
for (i in 1:100) { printed <- FALSE if (i %% 3 == 0) { cat("Fizz") printed <- TRUE } if (i %% 5 == 0) { cat("Buzz") printed <- TRUE } if (!printed) { cat(i) } cat('\n') }
Wolfram Language
fizzbuzz[n_] := Module[ {div3 = Mod[n, 3] == 0, div5 = Mod[n, 5] == 0}, If[Or[div3, div5], If[div3, "Fizz", ""] <> If[div5, "Buzz", ""], ToString @ n]]; StringRiffle @ Table[fizzbuzz[n], {n, 1, 15}]