wvogel日記

自分用の技術備忘録が多めです.

Project Euler 45

trif :: (Integral a)=> a -> a
trif n = (n+1)*n `div` 2

hexf :: (Integral a) => a -> a
hexf n = n*(2*n-1)

pentaf::(Integral a) => a -> a
pentaf n = n*(3*n-1) `div` 2

divisors :: (Integral a) => a-> [a]
divisors n =filter  ((==0).(n`mod`)) [2..(div n 2)]

euler45 :: Integral a => a
euler45 =head $filter check45 [40755..]

check45 :: (Integral a) =>a -> Bool
check45 n = check45' $ takeWhile (\k -> k*k < n*2 ) $divisors n
 where
  check45' list = (any (==n) $map trif list)
                   && (any (==n)$ map hexf list)
                   && (any (==n)$ map pentaf list)

main = print $ euler45


これでちゃんと、40755が答えと返って来ますが、その次の、
三角数且つ五角数且つ六角数
を求めようとすると........
というわけで、処理するリストが長すぎるんだろう、と思い、takeWhile関数でリスト長を短くする工夫をしてみたり。
だめでしたけど笑


あるいは、
三角数且つ五角数且つ六角数
という条件から、数同士の関係性を見出せないかと立式してみる。
これも今のところなかなかうまくいってないどうしたものか。