Day 4 , part 1.
authorGreg Burri <greg.burri@gmail.com>
Tue, 4 Dec 2018 21:39:54 +0000 (22:39 +0100)
committerGreg Burri <greg.burri@gmail.com>
Tue, 4 Dec 2018 21:39:54 +0000 (22:39 +0100)
Day04.fs
Program.fs
Tests/Day04 tests.fs

index c3f2ee6..c56203d 100644 (file)
--- a/Day04.fs
+++ b/Day04.fs
@@ -1,18 +1,11 @@
 module AdventOfCode2018.Day04\r
 \r
 open System\r
+open System.Collections.Generic\r
 \r
-let parseInput (str : string) : string =\r
+let getSleepestGuard (str : string) : int * int =\r
     let shifts : int list array = Array.create 60 []\r
 \r
-    let addShift (id : int) (date1 : DateTime) (date2 : DateTime) =\r
-\r
-        let min1 = if date1.Hour > 0 then 0 else date1.Minute\r
-        let min2 = if date2.Hour > 0 then 59 else date2.Minute\r
-\r
-        for m = min1 to min2 - 1 do\r
-            shifts.[m] <- id :: shifts.[m]\r
-\r
     let lines =\r
         str.Split ([| '\r'; '\n'; |], StringSplitOptions.RemoveEmptyEntries)\r
         |> Array.choose (\r
@@ -21,15 +14,18 @@ let parseInput (str : string) : string =
                 if trimmed = "" then None else Some (DateTime.Parse (trimmed.Substring (1, 16)), trimmed)\r
         )\r
         |> Array.sortBy fst\r
-        (*\r
-        |> Array.fold (\r
-            fun id (dateTime, line) ->\r
-                match line.IndexOf '#' with\r
-                | i when i <> -1 -> line.Substring (i + 1, line.IndexOf (' ', i) - i - 1) |> int\r
-                | _ ->\r
-        ) 0*)\r
 \r
     let mutable id = 0\r
+    let minutesAsleep = Dictionary<int, int> ()\r
+\r
+    let addShift (date1 : DateTime) (date2 : DateTime) =\r
+        let min1 = if date1.Hour > 0 then 0 else date1.Minute\r
+        let min2 = if date2.Hour > 0 then 60 else date2.Minute\r
+\r
+        minutesAsleep.[id] <- minutesAsleep.GetValueOrDefault (id, 0) + min2 - min1\r
+\r
+        for m = min1 to min2 - 1 do\r
+            shifts.[m] <- id :: shifts.[m]\r
 \r
     for i = 0 to lines.Length - 1 do\r
         let dateTime, line = lines.[i]\r
@@ -37,17 +33,18 @@ let parseInput (str : string) : string =
         | i when i <> -1 -> id <- line.Substring (i + 1, line.IndexOf (' ', i) - i - 1) |> int\r
         | _ ->\r
             if line.Contains "wakes up" then\r
-                addShift id (fst lines.[i-1]) dateTime\r
-\r
-    sprintf "%A" shifts\r
-\r
-\r
-\r
-\r
+                addShift (fst lines.[i-1]) dateTime\r
 \r
+    let sleepestGuardId, _  = minutesAsleep |> Seq.fold (fun (id, max) guard -> if guard.Value > max then guard.Key, guard.Value else id, max) (0, 0)\r
 \r
+    let mutable sleepestTime = 0\r
+    let mutable asleepCountMax = 0\r
 \r
-    //Map<int, int>.\r
+    for i = 0 to shifts.Length - 1 do\r
+        let asleepCount = shifts.[i] |> List.where ((=) sleepestGuardId) |> List.length\r
+        if asleepCount > asleepCountMax then\r
+            sleepestTime <- i\r
+            asleepCountMax <- asleepCount\r
 \r
+    sleepestGuardId, sleepestTime\r
 \r
-    //
\ No newline at end of file
index 346eb36..6e7f256 100644 (file)
@@ -15,11 +15,11 @@ let day02 () =
 let day03 () =\r
     let claims = File.ReadAllText "Data/day03.input" |> Day03.parseInput\r
     let surface, claimId = Day03.overlappingSurface claims\r
-    sprintf "part1 = %A, part2 = %A"  surface claimId\r
+    sprintf "part1 = %A, part2 = %A" surface claimId\r
 \r
 let day04 () =\r
-    // sprintf "part1 = %A, part2 = %A"  surface claimId\r
-    ""\r
+    let sleepestGuardId, sleepestTime = File.ReadAllText "Data/day04.input" |> Day04.getSleepestGuard\r
+    sprintf "part1 = %A, part2 = " (sleepestGuardId * sleepestTime)\r
 \r
 let days : Map<int, unit -> string> =\r
     [\r
index b952e14..149aae0 100644 (file)
@@ -33,7 +33,7 @@ type ``Day04 tests`` (output : ITestOutputHelper) =
                 [1518-11-05 00:55] wakes up\r
             """\r
 \r
-        output.WriteLine (Day04.parseInput input)\r
+        output.WriteLine (Day04.getSleepestGuard input |> string)\r
 \r
         1 =! 2\r
         ()\r