forとifを使わないC言語による「FizzBuzz」の解法が難解な件

Code

FizzBuzz」とはプログラマーの素養をテストすることに使われたりする簡単な問題のこと。問題の性質的にifとかforを使って解くのが普通なんですけど、FizzBuzz in C Without Conditional Statementsで紹介されている解法はかなりユニークで、ifとfor文を全く使っていません。

int i(const int i) { printf("%d\n", i); return i; }
int f(const int i) { printf("Fizz\n"); return i; }
int b(const int i) { printf("Buzz\n"); return i; }
int fb(const int i) { printf("FizzBuzz\n"); return i; }
int (* PC[15])(int i) = {i,i,f,i,b,f,i,i,f,b,i,f,i,i,fb}; // Printer Cycle

int go(const int arg) {
  return PC[(arg - 1) % 15](arg) + 1;
}

int stop(const int arg) {
  PC[(arg - 1) % 15](arg);
  exit(0);
}

int (* LC[2]) (int index) = { go, stop }; // Logic Cycle

void recurse(const int i, const int kill_num) {
  recurse(LC[!(i % kill_num)](i), kill_num);
}

int main(const int argc, const char *argv[]) {
  recurse(1, atoi(argv[1]));
}

再帰と関数ポインタを駆使しています。C言語の関数ポインタに慣れていないと(慣れていても?)かなり難解なプログラムかも。頭の体操にはなりそうです。

スポンサーリンク