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

38 lines
1.0 KiB
FSharp

module _33
open common
let cancelling =
let nds = seq {
for d in 11..99 do
if d % 10 <> 0 then
for n in 11..(d-1) do
if n % 10 <> 0 then
yield (n,d)
}
let cancelCommonDigits (n,d) =
let nd = numDigits n
let dd = numDigits d
seq {
for ndi in nd do
for ddi in dd do
if ndi = ddi then
let ndmi = Array.filter ((<>) ndi) nd
let ddmi = Array.filter ((<>) ddi) dd
if (ndmi.Length > 0 && ddmi.Length > 0) then
yield (digitsNum ndmi, digitsNum ddmi)
}
nds
|> Seq.collect (fun (n,d) ->
let f = float n/float d
cancelCommonDigits (n,d)
|> Seq.map (fun (cn,cd) -> (float cn/float cd,cn,cd,n,d))
|> Seq.filter (fun (cf,_,_,_,_) -> cf = f)
)
|> Seq.fold (fun (pn, pd) (_,n,d,_,_) -> (pn * n, pd * d)) (1,1)
|> Fraction.reduce
|> snd