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))))

上のネタで思い出した。

http://karetta.jp/book/okite

これの「第一章 下手ですね」の中の「藪医者」で書かれている文。

医者の世界に、どのくらいの割合で薮医者がいるかは知らない。でも、コンピュータの世界に比べれば微々たるものであろう。薮プログラマの割合は、極めて少なく見積もっても50%を越えるであろう。要するに過半数はゴミだということ。

このゴミのような技術者にお金を支払うなんて、とんでもないことである。そんな無駄なお金があるのなら、ゴミを排除し、余った金のいくばくかでも優秀な技術者を優遇するために使うべきである。そうすれば、プログラム開発は遅れを取り戻し、開発費用も減少する。

…洋の東西や時代を問わず、同じなんだなぁ、と。