Problem 12

今日は Problem 12をやってみた。

cf. Project Euler - Problem 12
via 自堕落系徒然日記 - Problem 12 三角数の約数

 import Data.List
 
 triangleNumbers :: [Integer]
 triangleNumbers = snd $ mapAccumL (\a x -> (a+x, a)) 1 [2..]
 
 divisors :: Integer -> [Integer]
 divisors n = concat [ z | x <- [1..floor (sqrt (fromInteger n))]
                     , let (y,r) = n `divMod` x
                     , r == 0
                     , let z = if x == y then [x] else [x,y]]
 
 euler012 :: Integer
 euler012 = f $ euler012'
   where
     euler012' = find (\x -> (length . divisors) x > 500) triangleNumbers
     f (Just x) = x
 
 main :: IO ()
 main = print euler012

約数を求める関数 divisors はこないだの nobsun さんのやつにちょっと手を入れた。
コンパイルしてから実行して数秒といったところ。もっと工夫できるのかも。

 ^o^ >ghc -o euler012 euler012.hs
 
 ^o^ >euler012
 76576500