Problem 12

2008年3月28日
1 分

今日は 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