morris555's diary

高校生のブログです。

Problem 12

Problem 12は500個以上の約数を持つ最小の三角数を求める問題です。

import Data.List (group)

factorize 1 = [(1, 0)]
factorize n = format . factorize' n $ 2:3:[x + y | x <- [6, 12 ..], y <- [-1, 1]]
        where
                factorize' n xs'@(x : xs)
                        | n < x * x    = [n]
                        | rem n x == 0 = x : factorize' (div n x) xs'
                        | otherwise    = factorize' n xs
                format xss = [(head xs, length xs) | xs <- group xss]

numOfDivs n = product [b + 1 | (_, b) <- factorize n]

triNums = tri 1 2 1
        where tri v add d = v : tri (v + add) (add + d) d

main = print . head . dropWhile ((<= 500) . numOfDivs) $ triNums

今回も遅いです。

上手な書き方ができません。

まだまだ勉強不足ですね。