-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathproblem40.fsx
35 lines (26 loc) · 859 Bytes
/
problem40.fsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(* Project Euler Problem 40
* By Weisi Dai <[email protected]>
*)
let ubound = 7
let BASE = 10
let minNDigit n = pown BASE (n - 1)
let champDigit n =
let rec findDigit digits remaining =
let segLength = digits * (minNDigit (digits + 1)
- minNDigit digits )
if remaining > segLength then
findDigit (digits + 1) (remaining - segLength)
else
let delta = remaining / digits
let pos = remaining % digits
(string <| (minNDigit digits) + delta)
.ToCharArray().[pos] |> string |> int
findDigit 1 (n - 1)
let digits = seq {
for i in 1 .. ubound do
let pos = minNDigit i
yield champDigit pos
}
let problem40 = Seq.fold ( * ) 1 digits
let main() = printfn "The answer is %d." (problem40)
main()