Files
project-euler/58.fs
T
2025-08-03 20:16:55 -07:00

34 lines
890 B
FSharp

module _58
open common
let primeDiagonals =
let isPrime n =
let limit = System.Math.Ceiling(sqrt (float n)) |> int
let rec check i =
i > n/limit || (n % i <> 0 && check (i + 1))
check 2
// let isPrime = isPrimeW [2I;3I]
let sideLengthPrimeCount l = 1 + (l - 1) * 2
let sideLengths =
(2,2) |> Seq.unfold(
fun (l, r) ->
match r with
| 0 -> Some(l, (l + 2, 3))
| _ -> Some(l, (l, r - 1))
)
sideLengths
|> Seq.scan (fun (c,_) l -> (c + (l), l + 1)) (3,3)
|> Seq.scan (fun (p,_) (d,l) ->
let r = isPrime (d)
match r with
| true -> (p + 1, l)
| false -> (p, l)
) (0,0) |> Seq.skip 1
|> Seq.skipWhile (fun (p,l) -> (float p)/(float (sideLengthPrimeCount l)) >= 0.1)
|> Seq.nth 1