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関数でリスト長を短くする工夫をしてみたり。
だめでしたけど笑
あるいは、
三角数且つ五角数且つ六角数
という条件から、数同士の関係性を見出せないかと立式してみる。
これも今のところなかなかうまくいってないどうしたものか。