-- Copyright (c) 2012, Christoph Pohl BSD License (see
-- http://www.opensource.org/licenses/BSD-3-Clause)
-------------------------------------------------------------------------------
--
-- Project Euler Problem 12
--
-- The sequence of triangle numbers is generated by adding the natural numbers.
-- So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The
-- first ten terms would be:
--
-- 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
--
-- Let us list the factors of the first seven triangle numbers:
--
--   1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28:
--   1,2,4,7,14,28
--
-- We can see that 28 is the first triangle number to have over five divisors.
-- 
-- What is the value of the first triangle number to have over five hundred
-- divisors?

module Main where

main :: IO ()
main = print result

result = blubb 1

triangle :: Integer -> Integer
triangle n = sum([1..n])

isDivisor :: Integer -> Integer -> Bool
isDivisor d x = rem x d == 0

isqrt :: Integer -> Integer
isqrt = floor . sqrt . fromIntegral

nDivisors :: Integer -> Int
nDivisors x = 2*length( [d | d <- [1..isqrt(x)], isDivisor d x] )

blubb n | nDivisors( triangle n ) <= 500 = blubb (n+1)
        | nDivisors( triangle n ) > 500 = triangle n
