Project Euler – 問題45

三角数、五角数、六角数はそれぞれ次の式で求められる。 三角数、Tn = n (n + 1) / 2、1, 3, 6, 10, 15, … 五角数、Pn = n (3n – 1) / 2、1, 5, 12, 22, 35, … 六角数、Hn = n (2n – 1)、1, 6, 15, 28, 45, …

ここでT285 = P165 = H143 = 40755ということがわかる。

次に三角数かつ五角数かつ六角数となる値を求めよ。

三角数、五角数については以前に定義したものを使う。六角数は以下のように 無限リストで定義する。

三角数について、関数alsoでその値が五角数および六角数に含まれているかを filterし、求まったリストの2番目で解が求まる。

hexagonals = 1 : zipWith (+) hexagonals diffs
    where diffs = [5,9..]

euler045 = (filter also triangles) !! 2
    where also n = (n == (last $ takeWhile (<= n) pentagonals))
                   && (n == (last $ takeWhile (<= n) hexagonals))