|
1 | 1 | // Learn more about F# at http://fsharp.org
|
2 | 2 |
|
3 |
| -open System |
4 | 3 | open Cistern.Linq.FSharp
|
5 | 4 | open System.Diagnostics
|
6 | 5 |
|
7 | 6 | [<EntryPoint>]
|
8 |
| -let main argv = |
| 7 | +let main _ = |
9 | 8 | Register.RegisterFSharpCollections ()
|
10 | 9 |
|
11 |
| - let listSize = 10000 |
12 |
| - let iterations = 1 |
13 |
| - let repetitions = 5 |
14 |
| - |
15 |
| - let x = Random 42 |
16 |
| - let test = List.init listSize (fun n -> x.NextDouble ()) |
| 10 | + let iterations = 1000000 |
| 11 | + let repetitions = 3 |
17 | 12 |
|
18 | 13 | for _i = 1 to repetitions do
|
19 | 14 | let sw = Stopwatch.StartNew ()
|
20 | 15 |
|
21 |
| - let mutable total = 0. |
22 | 16 | for i = 1 to iterations do
|
23 |
| - let triangleNumber(n:int64) = [1L..n] |> Seq.sum |
24 |
| - |
25 |
| - let findFactorsOf(n:int64) = |
26 |
| - let upperBound = int64(Math.Sqrt(double(n))) |
27 |
| - [1L..upperBound] |
28 |
| - |> Seq.filter (fun x -> n % x = 0L) |
29 |
| - |> Seq.collect (fun x -> [x; n/x]) |
30 |
| - |
31 |
| - let naturalNumbers = Seq.unfold (fun x -> Some(x, x+1L)) 1L |
| 17 | + let fibonacciLinq = Linq.unfold (fun (current, next) -> Some(current, (next, current + next))) (0, 1) |
32 | 18 |
|
33 |
| - let answer = |
34 |
| - naturalNumbers |
35 |
| - |> Seq.map (fun x -> triangleNumber(x)) |
36 |
| - |> Seq.filter (fun x -> Seq.length(findFactorsOf(x)) >= 500) |
37 |
| - |> Seq.head |
| 19 | + let fibTotal = |
| 20 | + fibonacciLinq |
| 21 | + |> Linq.takeWhile (fun n -> n < 4000000) |
| 22 | + |> Linq.filter (fun n -> n % 2 = 0) |
| 23 | + |> Linq.sum |
38 | 24 |
|
39 |
| - total <- total + float answer |
| 25 | + burning_monk_euler.Helpers.validate 4613732 fibTotal |
40 | 26 |
|
41 |
| - printfn "Seq %d (%f)" sw.ElapsedMilliseconds total |
| 27 | + printfn "Cistern %dms" sw.ElapsedMilliseconds |
42 | 28 |
|
43 | 29 | for _i = 1 to repetitions do
|
44 | 30 | let sw = Stopwatch.StartNew ()
|
45 | 31 |
|
46 | 32 | let mutable total = 0.
|
47 | 33 | for i = 1 to iterations do
|
48 |
| - let triangleNumber(n:int64) = [1L..n] |> Linq.sum |
| 34 | + let fibonacciSeq = Seq.unfold (fun (current, next) -> Some(current, (next, current + next))) (0, 1) |
49 | 35 |
|
50 |
| - let findFactorsOf(n:int64) = |
51 |
| - let upperBound = int64(Math.Sqrt(double(n))) |
52 |
| - [1L..upperBound] |
53 |
| - |> Linq.filter (fun x -> n % x = 0L) |
54 |
| - |> Linq.collect (fun x -> [x; n/x]) |
55 |
| - |
56 |
| - let naturalNumbers = Linq.unfold (fun x -> Some(x, x+1L)) 1L |
57 |
| - |
58 |
| - let answer = |
59 |
| - naturalNumbers |
60 |
| - |> Linq.map (fun x -> triangleNumber(x)) |
61 |
| - |> Linq.filter (fun x -> Linq.length(findFactorsOf(x)) >= 500) |
62 |
| - |> Linq.head |
63 |
| - |
64 |
| - total <- total + float answer |
65 |
| - |
66 |
| - printfn "Cistern %d (%f)" sw.ElapsedMilliseconds total |
| 36 | + let fibTotal = |
| 37 | + fibonacciSeq |
| 38 | + |> Seq.takeWhile (fun n -> n < 4000000) |
| 39 | + |> Seq.filter (fun n -> n % 2 = 0) |
| 40 | + |> Seq.sum |
67 | 41 |
|
| 42 | + burning_monk_euler.Helpers.validate 4613732 fibTotal |
68 | 43 |
|
| 44 | + printfn "Seq %dms" sw.ElapsedMilliseconds |
69 | 45 |
|
70 | 46 | 0 // return an integer exit code
|
0 commit comments