Life Goes On

まあまあだけど楽しんでる方です

45問目

http://projecteuler.net/index.php?section=problems&id=45
五角数でも六角数でもある三角数のうち40755の次の数を求める。
六角数は三角数に含まれるので、五角数でかつ六角数のものを求めれば十分だったようです。そんなこととは知らず、真面目に求めてしまいました。

main = print $ euler045 40755

euler045 :: Integer -> Integer
euler045 n = head $ dropWhile (<= n) $ search tri pen hex

search :: [Integer] -> [Integer] -> [Integer] -> [Integer]
search (t : ts') ps hs
    | (t == head ps' && t == head hs') = t : (search ts' ps' hs')
    | otherwise = search ts' ps' hs'
    where
        ps' = dropWhile (< t) ps
        hs' = dropWhile (< t) hs

tri :: [Integer]
tri = [ div (n * (n + 1)) 2 | n <- [1..] ]

pen :: [Integer]
pen = [ div (n * (3 * n - 1)) 2 | n <- [1..] ]

hex :: [Integer]
hex = [ n * (2 * n - 1) | n <- [1..] ]