Project Euler 41

http://projecteuler.net/index.php?section=problems&id=41


順列を逆に出すだけです。

let count n = Seq.initInfinite (fun k -> k + n)
let to_number a = List.fold (fun x y -> x * 10 + y) 0 a
let is_prime n = Seq.forall (fun p -> n % p <> 0)
                  (Seq.takeWhile (fun p -> p * p <= n) (count 2))

let rec permutations = function
   | [] -> seq [ [] ]
   | a  -> seq {
            for e in a do
               for b in permutations (List.filter ((<>) e) a)
                  -> e :: b }

let s = seq {
   for n in 7..-1..1 do
      for n in Seq.filter is_prime (Seq.map to_number (
                                       permutations [ n..(-1)..1 ]))
         -> n
}

printfn "%d" (Seq.head s)