namespace Solutions module Day4 = open System.IO open System.Text.RegularExpressions type range = { startID: int; endID: int } let getRanges input = let matches = Regex.Matches(input, "(\d+)-(\d+),(\d+)-(\d+)") |> Seq.head |> fun x -> x.Groups |> Seq.map (fun x -> x.Value) |> List.ofSeq |> List.tail assert (Seq.length matches = 4) {startID = int matches[0]; endID = int matches[1]}, {startID = int matches[2]; endID = int matches[3]} let ranges = File.ReadLines("inputs/day4.txt") |> Seq.map getRanges let contains (rangeA, rangeB) = (rangeA.startID <= rangeB.startID && rangeA.endID >= rangeB.endID) || (rangeA.startID >= rangeB.startID && rangeA.endID <= rangeB.endID) let part1 () = ranges |> Seq.filter contains |> Seq.length let overlaps (rangeA, rangeB) = (rangeA.startID >= rangeB.startID && rangeA.startID <= rangeB.endID) || (rangeA.endID >= rangeB.startID && rangeA.endID <= rangeB.endID) || (rangeB.startID >= rangeA.startID && rangeB.startID <= rangeA.endID) || (rangeB.endID >= rangeA.startID && rangeB.endID <= rangeA.endID) let part2 () = ranges |> Seq.filter overlaps |> Seq.length