summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--Program.fs2
-rw-r--r--solutions/day4.fs35
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