Project Euler 40

http://projecteuler.net/index.php?section=problems&id=40


数字を一桁ずつ出すクラスを作る。本当はそうする必要も無いが、練習のつもりで。


itertools.h

#include <iostream>
#include "itertools.h"

using namespace std;
using namespace itertools;

class cDigitSeq {
    int n;
    vector<int> v;
    
public:
    cDigitSeq() : n(0), v(vector<int>()) { }
    int next() {
        if(v.size() == 0) {
            n += 1;
            v = list(digits(n));
        }
        int m = v.back();
        v.pop_back();
        return m;
    }
    bool exists_next() { return true; }
};

typedef tuple<int,int>  tup;

template<typename T>
int d(int n, T& g) {
    return snd(head(filter([n] (tup x) { return fst(x) == n; }, g)));
}

int main() {
    auto    g = zip(itertools::count<>(1), cDigitSeq());
    auto    t = reduce([&g] (tup x, int y)
                { return tup(fst(x) * d(snd(x), g), snd(x) * 10); },
                range<>(7), tup(1, 1));
    cout << fst(t) << endl;
}