Fizz-Buzz

数日前に職場でも話題になったネタ。

どうしてプログラマに・・・プログラムが書けないのか?

Fizz-Buzz問題の例はこんな感じだ。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

…まぁ、プログラムで飯を食っている人間で、さすがにこれが出来ん人はおらんと信じたいところだが、原文の言を信じるならば実際はそうではないらしい。


即興で書くとこんな感じだが…

#include <stdio.h>

int main(void)
{
  int i;

  for(i = 1; i <= 100; i++) {
    if(!(i % 3) || !(i % 5)) {
      printf("%s%s\n", (i%3) ? "" : "Fizz" , (i%5) ? "" : "Buzz");
    } else {
      printf("%3d\n", i);
    }
  }
  return 0;
}

確かに、書いた後「もっとシンプルにならんものか」とか考え込んだりせんわけでもない。
ただ、考え込むのは書いた後にやるべきことだったりするので、まずは2分以内にこいつもしくは同じ程度のコードは書いてみせるべきなんだろうな。

【おまけ】
暇つぶしに EmacsLisp版を書いてみるw
*scratch* buffer などで C-j で実行できるですよ。

(let ((i 1))
  (while (< i 101)
    (if (or (= 0 (% i 3)) (= 0 (% i 5)))
	(insert (format "%s%s\n"
			(if (= 0 (% i 3)) (eval "Fizz") (eval ""))
			(if (= 0 (% i 5)) (eval "Buzz") (eval ""))))
      (insert (format "%3d\n" i)))
    (setq i (1+ i))))