Project Euler 1

Haskellのように、とは言わないが、C++でもPythonのように書けないだろうか。

桃の天然水 - Project Euler 1(1)


ではHaskellのように。

#include <iostream>
#include <pstade/oven/counting.hpp>
#include <pstade/oven/filtered.hpp>
#include <pstade/oven/regular.hpp>
#include <pstade/oven/numeric.hpp>
#include <boost/lambda/lambda.hpp>

namespace oven = pstade::oven;
using boost::lambda::_1;

const int n = 1000;

int main()
{
    std::cout <<
        oven::accumulate(
            oven::counting(1, n) | oven::filtered(oven::regular(_1 % 3 == 0 || _1 % 5 == 0)),
            0)
    << std::endl;
}

ついでにリスト内包表記でも。

#include <iostream>
#include <pstade/oven/counting.hpp>
#include <pstade/oven/comprehension.hpp>
#include <pstade/oven/regular.hpp>
#include <pstade/oven/numeric.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

namespace oven = pstade::oven;
using boost::lambda::_1;

const int n = 1000;

int main()
{
    std::cout <<
        oven::accumulate(
            oven::comprehension(
                _1,
                _1 % 3 == 0 || _1 % 5 == 0,
                boost::lambda::bind(oven::counting, 1, n)
            ),
            0
        )
    << std::endl;
}