summary refs log blame commit diff stats
path: root/day15.fsx
blob: 6c7d977608f518075e87a3f7869923ec63f08dc4 (plain) (tree)

































                                                                                                   
open System

type Generator =
    struct
        val mutable current: int64
        val factor: int64
        new (c, f) = {current=c; factor=f}

        member this.generate(multiple: int64) =
            this.current <- (this.current * this.factor) % 2147483647L
            if multiple <> 0 && this.current % multiple <> 0 then this.generate(multiple)
        
        member this.toBits() =
            Convert.ToString(this.current, 2).PadLeft(32, '0') |> Seq.toArray |> (fun x -> x[16..])
    end

let countValid iterations multipleA multipleB =
    let mutable generatorA = new Generator(591, 16807)
    let mutable generatorB = new Generator(393, 48271)
    
    let mutable count = 0
    for i = 1 to iterations do
        generatorA.generate(multipleA)
        generatorB.generate(multipleB)
        let aLow16 = generatorA.toBits()
        let bLow16 = generatorB.toBits()
        if aLow16 = bLow16 then 
            count <- count + 1
    
    printfn "%d" count

let () =
    countValid 40000000 0 0
    countValid 5000000 4 8