summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--day20.fsx27
1 files changed, 27 insertions, 0 deletions
diff --git a/day20.fsx b/day20.fsx
new file mode 100644
index 0000000..595a1eb
--- /dev/null
+++ b/day20.fsx
@@ -0,0 +1,27 @@
+open System.IO
+
+let lines = File.ReadAllLines "day20.txt"
+            |> Array.map (fun x -> x.Split "-")
+            |> Array.map (fun x -> (int64 x[0], int64 x[1]))
+            |> Array.sortBy fst
+            |> List.ofArray
+
+let rec minIP  blocked inputs=
+    match inputs with
+    | (lo, hi)::rest ->
+        if lo > blocked + 1L then blocked + 1L
+        else minIP (max blocked hi) rest
+    | _ -> 0L
+
+let getAllowed blockedRanges =
+    let rec mergeRanges n ranges = seq {
+        match ranges with
+        | [] -> yield (n,4294967295L)
+        | (lo,hi)::tail ->
+            if n < lo then yield (n,lo-1L)
+            yield! mergeRanges (max n (hi+1L)) tail
+    }
+    mergeRanges 0L blockedRanges
+
+minIP 0L lines |> printfn "%A"
+getAllowed lines |> Seq.sumBy (fun (lo, hi) -> hi - lo + 1L) |> printfn "%d"
\ No newline at end of file