二つの連続した数が二つの異なる素因数をもつ最初の組み合わせは 14 = 2 x 7, 15 = 3 x 5である。
三つの連続した数が三つの異なる素因数をもつ最初の組み合わせは 644 = 2^2 x 7 x 23, 645 = 3 x 5 x 43, 646 = 2 x 17 x 19である。
四つの連続した数が四つの異なる素因数をもつ最初の組み合わせの、四つの中 の最初の数を求めよ。
まずは2以上の数とその異なる素因数の数のタプルのリストを生成する。異なる 素因数の数を求める関数dpsはnを素因数分解し、nubで重複を取り除き、リスト の長さを求めている。次に関数consecsで異なる素因数の数が4の場合が4つ連続 しているものを再帰的に求める。
consecsの引数は最初が異なる素因数の数が4の場合が連続している数、次が連 続が始まった数、次に最初のリスト。連続している数が4になった場合、その連 続が始まった数が答えである。リストの先頭の異なる素因数の数が4の場合、そ れが連続の最初ならそのときの値を途中なら渡された値を渡して連続している 数を1増やす。
euler047 = consecs 0 0 [(n, dps n) | n <- [2..]]
where dps n = length $ nub $ primeFactorize n
consecs 4 s _ = s
consecs 0 _ ((n, 4):xs) = consecs 1 n xs
consecs i s ((_, 4):xs) = consecs (i + 1) s xs
consecs _ _ (_:xs) = consecs 0 0 xs
