34 lines
890 B
FSharp
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
|