diff options
-rw-r--r-- | Program.fs | 2 | ||||
-rw-r--r-- | solutions/day4.fs | 35 |
2 files changed, 37 insertions, 0 deletions
diff --git a/Program.fs b/Program.fs index 7e7cb55..7a64584 100644 --- a/Program.fs +++ b/Program.fs @@ -14,5 +14,7 @@ match (day, part) with | (2, 2) -> Day2.part2 () |> printf "%A\n" | (3, 1) -> Day3.part1 () |> printf "%A\n" | (3, 2) -> Day3.part2 () |> printf "%A\n" +| (4, 1) -> Day4.part1 () |> printf "%A\n" +| (4, 2) -> Day4.part2 () |> printf "%A\n" | (x, y) when (1 <= x && x <= 25) && (y = 1 || y = 2) -> raise (NotImplemented("not implemented yet")) | _ -> raise (NotImplemented("invalid values")) \ No newline at end of file diff --git a/solutions/day4.fs b/solutions/day4.fs new file mode 100644 index 0000000..beb0515 --- /dev/null +++ b/solutions/day4.fs @@ -0,0 +1,35 @@ +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 \ No newline at end of file |