let isPalindrome (x : int) = let numberArray = x.ToString().ToCharArray()
numberArray = Array.rev numberArray
I figured out how to use the PSeq
library to do lazy filtering on a sequence:
let generator =
seq {
for x in 990000..999999 do
for y in 990000..999999 do
yield (x, y, x*y)
}
generator
|> PSeq.filter(fun (x, y, z) -> isPalindrome z)
|> Seq.max
Real: 00:00:28.938, CPU: 00:01:49.078, GC gen0: 3448, gen1: 2, gen2: 0
Sadly, this was slower than my ugly hack:
let numberArray = [|990000..999999|]
let result = numberArray |> Array.Parallel.collect(fun x -> [| for y in numberArray do if isPalindrome (x*y) then yield (x, y, x*y)|])
|> Array.maxBy(fun (x, y, z) -> z)
Real: 00:00:24.779, CPU: 00:01:32.109, GC gen0: 2680, gen1: 18, gen2: 1