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
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
| 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
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