Fizz Buzz問題を解いてみた
どこかでFizzBuzzが書けないやつはプログラマではないという記事を見たので、あわてて書いてみた。
#include <iostream> template <int N, bool f15, bool f5, bool f3> struct Message { static const int value = N; }; template<int N, bool f5, bool f3> struct Message<N, true, f5, f3> { static const char* value; }; template <int N, bool f5, bool f3> const char* Message<N, true, f5, f3>::value = "Fizz Buzz"; template<int N, bool f3> struct Message<N, false, true, f3> { static const char* value; }; template <int N, bool f3> const char* Message<N, false, true, f3>::value = "Buzz"; template<int N> struct Message<N, false, false, true> { static const char* value; }; template <int N> const char* Message<N, false, false, true>::value = "Fizz"; template<int N, int M> struct is_mod { static const bool value = N%M==0; }; template<int N> struct FizzBuzz { static void print() { std::cout << Message<N, is_mod<N, 15>::value, is_mod<N, 5>::value, is_mod<N, 3>::value>::value << std::endl; } }; template<int N> struct FizzBuzzList { static void print() { FizzBuzzList<N-1>::print(); FizzBuzz<N>::print(); } }; template<> struct FizzBuzzList<0> { static void print() { } }; int main() { FizzBuzzList<35>::print(); return 0; }
もう少しきれいに書ける気がするけど、単純に書くとこんなもん?
結構こりだすと幾らでも突き詰めることが出来る気がするので、奥が深いなぁと感じた。
ところで今回のようにテンプレートを使用した場合、剰余記号(%)を使うのはズルなんですかね?
まあ、暇があったら使わないバージョンも書いてみよう。。。