F# で Project Euler Problem 24
まづ、0,1,2,3 の数列で試してみる
> let problem24 x = - let i = ref x - let s = ref (Set [0..3]) - [3 .. -1 .. 1] - |> List.iter - ( - fun n -> - let j = if n = 1 then 1 else List.reduce(*) [n .. -1 .. 2] - let mutable k = !i / j - i := !i % j - if !i = 0 then k <- k - 1 - if k < 0 then k <- n + 1 + k - let m = (!s |> Set.toArray).[k] - printf "%d" m - - s := !s |> Set.remove m - if n = 1 then - printfn "%d" (!s |> Set.toArray).[0] - ) - ;; val problem24 : int -> unit > [1..13] |> List.iter(problem24) - ;; 0123 0132 0213 0231 0312 0321 1023 1032 1203 1230 1302 1320 2013 val it : unit = ()
0,1,2,3,4,5,6,7,8,9 の 1000000番目
> let problem24 x = - let i = ref x - let s = ref (Set [0..9]) - [9 .. -1 .. 1] - |> List.iter - ( - fun n -> - let j = if n = 1 then 1 else List.reduce(*) [n .. -1 .. 2] - let mutable k = !i / j - i := !i % j - if !i = 0 then k <- k - 1 - if k < 0 then k <- n + 1 + k - let m = (!s |> Set.toArray).[k] - printf "%d" m - - s := !s |> Set.remove m - if n = 1 then - printfn "%d" (!s |> Set.toArray).[0] - ) - ;; val problem24 : int -> unit > [999999..1000001] |> List.iter(problem24) - ;; 2783915406 2783915460 2783915604 val it : unit = ()
最後は...
> problem24 (List.reduce(*) [10 .. -1 .. 1]);; 9876543210 val it : unit = ()