「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言語の関数ポインタに慣れていないと(慣れていても?)かなり難解なプログラムかも。頭の体操にはなりそうです。