I’m skipping problem 11 for now, since I can’t think of an elegant way to do it, and writing out the ‘C’ style solution I have in my head doesn’t seem like an interesting exercise. Any suggestions? Anyway, on to problem 12:

What is the value of the first triangle number to have over five hundred divisors?

module Problem12 =
let triangleNumbers = Seq.initInfinite (fun n -> (n+2) * (n+3) / 2) //skip the first triangle number (1), to avoid having to deal with an edge case in numFactors
//could probably speed this up a lot by pre-calculating prime factors (maybe using a LazyList)
let factors n =
let rec loop n m ms =
if n % m = 0 then
loop (n/m) m (m::ms)
elif n > m then
loop n (m+1) ms
else
ms
loop n 2 []
let numFactors n = factors n |> Seq.countBy(fun x->x) |> Seq.map (fun (a,b) -> b+1) |> Seq.reduce(*)
let ans = Seq.find (fun x -> numFactors x > 500) triangleNumbers;;

Like problem 10, this is trivial, given the solution to a previous problem. I ended up re-writing the factors function from problem 3, because the old function needed to handle 64 bit values, and this doesn’t. There’s a nice stackoverflow answer on how to do this generically; I may give that a shot in the future, but this solution is good enough for now :-).

### Like this:

Like Loading...

*Related*