C で FizzBuzz
ふと思い付いて C で FizzBuzz を書いてみた。
#include <stdio.h> int main(void) { int count; for (count = 1; count <= 100; count++) { if (count % 15 == 0) { printf("FizzBuzz\n"); } else if (count % 3 == 0) { printf("Fizz\n"); } else if (count % 5 == 0) { printf("Buzz\n"); } else { printf("%d\n", count); } } return 0; }
FizzBuzz 問題の解説。
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
http://ja.wikipedia.org/wiki/Fizz_Buzz
なんでこれが2分で書けないかあまり理解できないが(汗)、おそらく条件分岐のところで「ダブり」や「漏れ」が出てくるのだろう(と推測)。
厳密に考え過ぎるのが癖な自分は逆に、「15の倍数のときは、"FizzBuzzFizzBuzz" と出力するのだろうか?」なんて考えてました。
これだけではつまらないので、色々縛りを加えて遊んでみる。
// FizzBuzz 問題に剰余記号"%"を用いずに挑戦!! // 手動で"%"を作ったのと同じ。あまり納得いかない。 #include <stdio.h> int main(void) { int count, subCount3, subCount5; for (count = 1, subCount3 = 1, subCount5 = 1; count <= 100; count++, subCount3++, subCount5++) { if (subCount3 == 3 && subCount5 == 5) { printf("FizzBuzz\n"); subCount3 = 0; subCount5 = 0; } else if (subCount3 == 3) { printf("Fizz\n"); subCount3 = 0; } else if (subCount5 == 5) { printf("Buzz\n"); subCount5 = 0; } else { printf("%d\n", count); } } return 0; }
C にはコンマ演算子","なんてものがあるので、for ループの中で複数のカウンタを持ったりできる。
お次は再起呼び出しを使って FizzBuzz。色んな FizzBuzz を調べていく途中で、"%d" っていうのも文字列として返せることを(恥ずかしながらやっと)知った(滝汗)
#include <stdio.h> char *output[] = {"%d\n", "%d\n", "Fizz\n", "%d\n", "Buzz\n" , "Fizz\n", "%d\n", "%d\n", "Fizz\n", "Buzz\n" , "%d\n", "Fizz\n", "%d\n", "%d\n", "FizzBuzz\n"}; char *fizzbuzz(int); int main(void) { int count; for (count = 1; count <= 100; count++) { printf(fizzbuzz(count), count); } return 0; } char *fizzbuzz(int i) { if (i>15) { return fizzbuzz(i-15); } else { return output[i-1]; } }