Repo for my Advent of Code solutions.
open System.IO

let readLines (filePath: string) = seq {
    use sr = new StreamReader (filePath)
    while not sr.EndOfStream do
        yield sr.ReadLine()
}

let getMatches (partsOfLines: string array list list) predicate =
    [ for lineParts in partsOfLines do
        let part1 = lineParts.[0]
        let a = part1.[0] |> int
        let b = part1.[1] |> int
        let r = lineParts.[1].[0].[0]
        let rest = lineParts.[2].[0]
        let matches = [ for i in 0..rest.Length - 1 do
                        let c = rest.[i]
                        if (predicate a b r c i) then
                            yield c ]
        (a, b, matches.Length) ]

[<EntryPoint>]
let main argv =
    let lines = readLines "input.txt"
    let partsOfLines = [ for line in lines do
                            [ for section in line.Split [| ' ' |] do
                                section.Split [| '-'; ':' |] ] ]
    
    let part1Matches = getMatches partsOfLines (fun _ _ r c i -> c = r)
    let part2Matches = getMatches partsOfLines (fun a b r c i -> (i = a - 1 && c = r) || (i = b - 1 && c = r))

    let part1 = part1Matches |> List.filter (fun (a: (int * int * int)) -> 
                                                match a with
                                                | (a, b, count) -> count >= a && count <= b)
    let part2 = part2Matches |> List.filter (fun (_, _, count) -> count = 1)
    
    printf "%d %d\n" part1.Length part2.Length
    0