C++ でセミコロンを使わずに FizzBuzz

元ネタ:セミコロンを使わずにFizzBuzzが書きたーい!!(某Eテレ風に) - うなてっくろぐ


まぁ実は上記のサイトには C言語で簡単に出来る方法が書いてあるんですが、せっかくなので Boost.Phoenix を使って書いてみました。

[ソース]

#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/phoenix.hpp>

int
main(){
    if( boost::phoenix::let(boost::phoenix::local_names::_i = 1)[
        boost::phoenix::for_(
            boost::phoenix::nothing,
            boost::phoenix::local_names::_i < boost::phoenix::arg_names::arg1,
            ++boost::phoenix::local_names::_i)[
            std::cout <<
                boost::phoenix::if_else(boost::phoenix::local_names::_i % 15 == 0, "FizzBuzz",
                boost::phoenix::if_else(boost::phoenix::local_names::_i %  5 == 0, "Fizz",
                boost::phoenix::if_else(boost::phoenix::local_names::_i %  3 == 0, "Buzz",
                boost::phoenix::bind(
                    boost::lexical_cast<std::string, int>, boost::phoenix::local_names::_i) )
                ))
            << " "
        ]
    ](40), 0){}
}

[出力]

1 2 Buzz 4 Fizz Buzz 7 8 Buzz Fizz 11 Buzz 13 14 FizzBuzz 16 17 Buzz 19 Fizz Buzz 22 23 Buzz Fizz 26 Buzz 28 29 FizzBuzz 31 32 Buzz 34 Fizz Buzz 37 38 Buzz 

Boost.Phoenix の構文だと ; を書く必要が無いので、最後の ; に対応するだけですね。
流石に namespace が長いので可読性は悪いですが…。
んーどうにかして if 文も消し去りたい。

[boost]

  • ver 1.47.0