ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

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 = ()