Skip to content

Instantly share code, notes, and snippets.

@awostenberg
Created August 6, 2022 16:33
Show Gist options
  • Save awostenberg/efee8bf7d54c0c1d17c26e4fcc523061 to your computer and use it in GitHub Desktop.
Save awostenberg/efee8bf7d54c0c1d17c26e4fcc523061 to your computer and use it in GitHub Desktop.
even fibs
module Tests
open System
open Xunit
open FsUnit.Xunit
let fib (a,b) =
let sum = a+b
Some (sum,(b,sum))
let fibseq = Seq.unfold fib (0,1)
let sumEvensNotExceeding notToExceed numbers =
numbers |>
Seq.takeWhile (fun n -> n <= notToExceed) |>
Seq.filter (fun n -> n % 2 = 0) |>
Seq.map (fun n -> bigint n) |>
Seq.reduce (+)
let result = fibseq |> sumEvensNotExceeding 4_000_000
// 4_613_732
let [<Fact>] ``fib 0,1`` () = fib (0,1) |> should equal (Some (1,(1,1)))
let [<Fact>] ``fibseq take 1`` () = fibseq |> Seq.take 1 |> Seq.toList |> should equal [1]
let [<Fact>]``fibseq take 5`` () = fibseq |> Seq.take 5 |> Seq.toList |> should equal [1;2;3;5;8]
let [<Fact>]``sum evens not exceeding 10`` () = fibseq |> sumEvensNotExceeding 10 |> should equal 10I
let [<Fact>]``fencepost sum evens not exceeding 8`` () = fibseq |> sumEvensNotExceeding 8 |> should equal 10I
let [<Fact>] ``drylab result for 1,000,000`` () = fibseq |> sumEvensNotExceeding 4_000_000 |> should equal 42I
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment