FizzBuzz続き

剰余演算子を使うな!」とか言うとる人がおるらしい(直接見たわけじゃないが)ので、使わないでやってみる。

まぁ、実務においてはこういう真似やこだわりにさほど意味は無い場合が多いが、「倍数」の意味や性質を正しく理解しているか、という点については興味深い問題といえなくもない。ただ、倍数なんてものは義務教育の算数レベルだから、プログラマに限らず理解してないほうがおかしいんだけど。


んで、例のごとく最適化とかはそっちのけですw

#include <stdio.h>

int main(void)
{
  int i, three, five;

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

一応昨日おまけで EmacsLisp版を書いたので、こっちも作ってみる。

(let((i 1) (three 0) (five 0))
  (while (< i 101)
    (setq three (if (= 2 three) (eval 0) (1+ three)))
    (setq five (if (= 4 five) (eval 0) (1+ five)))
    (insert (if (zerop (* three five))
		(format "%s%s\n"
			(if (zerop three) (eval "Fizz") (eval ""))
			(if (zerop five) (eval "Buzz") (eval "")))
	      (format "%3d\n" i)))
    (setq i (1+ i))))

「倍数の意味や性質を理解している」という点を問うならば、剰余演算子を使うのは「正しく倍数の意味や性質を理解している」ことの、ひとつの証明でもあるわけなので、俺は使うことに抵抗はないな。


プラットフォームによっては処理コストが高いから使うのを避ける、とかいう場合は別だが、最近そんなプラットフォームはお目にかからんので、現実的に問題になることはまずあるまいし。