今日は Problem 12をやってみた。
cf. Project Euler – Problem 12
via 自堕落系徒然日記 – Problem 12 三角数の約数
module Main where 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