From 8f639ecdcdbdb34dfd8c2f9fe13a75b43dfc7088 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Tue, 4 Dec 2018 13:15:58 -0500 Subject: [PATCH] Day 4 --- lib/day4/day4.ex | 144 ++++++ lib/day4/input.txt | 1072 ++++++++++++++++++++++++++++++++++++++++++++ test/day4_test.exs | 83 ++++ 3 files changed, 1299 insertions(+) create mode 100644 lib/day4/day4.ex create mode 100644 lib/day4/input.txt create mode 100644 test/day4_test.exs diff --git a/lib/day4/day4.ex b/lib/day4/day4.ex new file mode 100644 index 0000000..072fc3a --- /dev/null +++ b/lib/day4/day4.ex @@ -0,0 +1,144 @@ +defmodule Day4 do + + defmodule Timestamp do + defstruct [:year, :month, :day, :hour, :minute] + + def create(y, m, d, h, min) do + %Timestamp{ + year: y |> String.to_integer(), + month: m |> String.to_integer(), + day: d |> String.to_integer(), + hour: h |> String.to_integer(), + minute: min |> String.to_integer + } + end + + def range(first, second) do + first.minute..second.minute + end + end + + def parse_event(line) do + res = Regex.run(~r/\[(\d+)-(\d+)-(\d+) (\d+):(\d+)\] (.+)/, line) + [_line, y, m, d, h, min, event | _tail] = res + { + Timestamp.create(y, m, d, h, min), + event + } + end + + def parse_events(lines) do + lines + |> Enum.map(&parse_event/1) + end + + def sort_events(events) do + events + |> Enum.sort_by(fn {ts, _} -> + {ts.year, ts.month, ts.day, ts.hour, ts.minute} + end) + end + + def parse_guard({_, msg}) do + case Regex.run(~r/Guard #(\d+) begins shift/, msg) do + [_event, id | _tail] -> id + _ -> nil + end + end + + def get_sleep_times(events) do + chunk_fun = fn event, acc -> + case parse_guard(event) do + nil -> {:cont, [event | acc]} + _id -> {:cont, Enum.reverse(acc), [event]} + end + end + after_fun = fn + [] -> {:cont, []} + acc -> {:cont, Enum.reverse(acc), acc} + end + events + |> Enum.chunk_while([], chunk_fun, after_fun) + |> Enum.reject(fn + [] -> true + _ -> false + end) + |> Enum.reduce(%{}, fn [begin_shift | events], acc -> + guard_id = parse_guard(begin_shift) + ranges = events + |> Enum.chunk_every(2) + |> Enum.map(fn [{sleep, _}, {wake, _} | []] -> + Timestamp.range(sleep, wake) + end) + Map.update(acc, guard_id, ranges, &(&1 ++ ranges)) + end) + |> Enum.reject(fn + {_id, []} -> true + _ -> false + end) + end + + def get_max_sleep_time(guards) do + guards + |> Enum.map(fn {id, times} -> + total = times + |> Enum.map(fn a..b -> b - a end) + |> Enum.sum() + {minute, _count} = times + |> Enum.flat_map(&Enum.to_list/1) + |> Enum.reduce(%{}, fn minute, acc -> + Map.update(acc, minute, 1, &(&1 + 1)) + end) + |> Enum.max_by(fn {_minute, count} -> count end) + {id, total, minute} + end) + |> Enum.max_by(fn {_id, total, _minute} -> total end) + end + + def range_containing(ranges) do + first = Enum.reduce(ranges, Enum.at(ranges, 0).first, fn first.._, acc -> + min(first, acc) + end) + last = Enum.reduce(ranges, Enum.at(ranges, 0).last, fn _..last, acc -> + max(last, acc) + end) + first..last + end + + def get_most_frequent_sleep_time(guards) do + guards + |> Enum.map(fn {id, times} -> + {minute, count} = range_containing(times) + |> Enum.map(fn minute -> + {minute, Enum.count(times, fn range -> minute in range end)} + end) + |> Enum.max_by(fn {_minute, count} -> count end) + {id, minute, count} + end) + |> Enum.max_by(fn {_id, _minute, count} -> count end) + end + + def parse_input() do + File.read!("lib/day4/input.txt") + |> String.split("\n", trim: true) + end + + def part1() do + {id, _total, minute} = parse_input() + |> parse_events() + |> sort_events() + |> get_sleep_times() + |> get_max_sleep_time() + String.to_integer(id) * minute + end + + def part2() do + {id, minute, _count} = parse_input() + |> parse_events() + |> sort_events() + |> get_sleep_times() + |> get_most_frequent_sleep_time() + String.to_integer(id) * minute + end + +end \ No newline at end of file diff --git a/lib/day4/input.txt b/lib/day4/input.txt new file mode 100644 index 0000000..f4c9815 --- /dev/null +++ b/lib/day4/input.txt @@ -0,0 +1,1072 @@ +[1518-04-25 00:24] falls asleep +[1518-05-22 23:50] Guard #3299 begins shift +[1518-06-25 00:25] falls asleep +[1518-04-13 00:54] wakes up +[1518-04-10 00:04] Guard #2467 begins shift +[1518-08-03 00:01] Guard #2543 begins shift +[1518-03-31 00:01] Guard #613 begins shift +[1518-07-07 00:57] wakes up +[1518-03-28 00:59] wakes up +[1518-07-15 23:59] Guard #883 begins shift +[1518-05-22 00:00] Guard #3299 begins shift +[1518-10-08 00:50] wakes up +[1518-05-05 00:16] wakes up +[1518-05-24 00:56] wakes up +[1518-04-15 00:57] falls asleep +[1518-07-18 00:16] falls asleep +[1518-09-29 00:52] wakes up +[1518-05-28 00:54] wakes up +[1518-04-30 00:54] wakes up +[1518-11-18 00:45] wakes up +[1518-08-26 00:56] wakes up +[1518-09-12 00:27] wakes up +[1518-09-09 00:47] falls asleep +[1518-07-22 00:43] falls asleep +[1518-09-20 00:00] Guard #263 begins shift +[1518-05-06 00:38] wakes up +[1518-08-21 00:51] falls asleep +[1518-08-15 00:44] wakes up +[1518-05-18 00:22] falls asleep +[1518-06-07 00:12] falls asleep +[1518-03-27 00:04] Guard #449 begins shift +[1518-05-12 23:52] Guard #1571 begins shift +[1518-10-24 00:00] Guard #3571 begins shift +[1518-10-08 00:40] falls asleep +[1518-08-18 00:03] Guard #883 begins shift +[1518-10-24 23:57] Guard #2161 begins shift +[1518-05-18 00:50] wakes up +[1518-06-06 00:49] wakes up +[1518-03-29 00:45] wakes up +[1518-07-26 00:55] wakes up +[1518-07-06 00:48] wakes up +[1518-09-02 23:59] Guard #1307 begins shift +[1518-09-20 23:57] Guard #577 begins shift +[1518-10-14 00:00] Guard #1697 begins shift +[1518-04-28 00:43] wakes up +[1518-05-17 00:09] falls asleep +[1518-04-06 00:45] falls asleep +[1518-10-16 00:00] Guard #1307 begins shift +[1518-08-22 00:09] falls asleep +[1518-08-13 00:29] falls asleep +[1518-08-04 00:48] wakes up +[1518-09-07 00:44] wakes up +[1518-04-24 00:56] falls asleep +[1518-04-09 00:41] falls asleep +[1518-11-16 00:29] falls asleep +[1518-04-16 00:55] wakes up +[1518-09-30 00:03] Guard #2543 begins shift +[1518-07-05 00:20] falls asleep +[1518-04-02 00:54] falls asleep +[1518-07-01 00:04] Guard #919 begins shift +[1518-03-03 00:38] wakes up +[1518-04-04 00:38] wakes up +[1518-09-16 00:40] falls asleep +[1518-07-04 00:31] falls asleep +[1518-03-01 00:59] wakes up +[1518-03-14 00:58] wakes up +[1518-05-21 00:04] Guard #283 begins shift +[1518-06-08 00:00] Guard #1307 begins shift +[1518-07-24 00:52] wakes up +[1518-04-15 00:41] wakes up +[1518-06-06 00:00] Guard #1619 begins shift +[1518-09-14 00:38] wakes up +[1518-03-28 00:36] wakes up +[1518-03-23 23:56] Guard #2423 begins shift +[1518-07-07 00:27] falls asleep +[1518-09-19 00:14] falls asleep +[1518-08-05 23:59] Guard #2423 begins shift +[1518-05-09 00:27] falls asleep +[1518-10-16 00:35] wakes up +[1518-05-16 00:51] falls asleep +[1518-07-14 00:29] wakes up +[1518-10-15 00:10] falls asleep +[1518-05-21 00:31] falls asleep +[1518-11-08 00:47] wakes up +[1518-09-15 00:53] wakes up +[1518-03-20 00:44] wakes up +[1518-03-22 00:48] wakes up +[1518-07-30 23:56] Guard #1571 begins shift +[1518-09-06 00:25] wakes up +[1518-04-20 23:57] Guard #613 begins shift +[1518-03-06 00:58] wakes up +[1518-04-09 00:03] Guard #2161 begins shift +[1518-10-11 23:52] Guard #1619 begins shift +[1518-05-15 00:01] Guard #953 begins shift +[1518-07-14 00:00] falls asleep +[1518-03-07 00:19] falls asleep +[1518-10-10 00:49] wakes up +[1518-07-05 00:56] wakes up +[1518-03-02 00:04] Guard #883 begins shift +[1518-04-20 00:44] falls asleep +[1518-11-22 00:33] falls asleep +[1518-03-30 00:57] wakes up +[1518-04-21 00:50] falls asleep +[1518-03-11 00:56] falls asleep +[1518-11-18 00:27] falls asleep +[1518-07-04 00:02] Guard #283 begins shift +[1518-06-04 00:53] wakes up +[1518-05-03 00:23] falls asleep +[1518-06-05 00:57] falls asleep +[1518-09-22 00:28] wakes up +[1518-08-23 00:54] falls asleep +[1518-10-22 00:49] wakes up +[1518-08-27 00:33] falls asleep +[1518-07-12 00:08] falls asleep +[1518-06-27 00:11] wakes up +[1518-06-28 00:55] wakes up +[1518-09-02 00:10] falls asleep +[1518-04-27 23:59] Guard #3571 begins shift +[1518-07-24 00:29] falls asleep +[1518-05-12 00:20] falls asleep +[1518-08-25 00:31] wakes up +[1518-03-13 23:58] Guard #919 begins shift +[1518-10-25 00:46] wakes up +[1518-05-26 00:57] wakes up +[1518-08-10 00:34] wakes up +[1518-10-07 00:33] falls asleep +[1518-09-14 00:53] wakes up +[1518-09-13 00:18] falls asleep +[1518-07-18 00:28] wakes up +[1518-09-04 00:26] falls asleep +[1518-06-16 00:38] wakes up +[1518-04-05 00:04] falls asleep +[1518-03-11 00:59] wakes up +[1518-07-26 00:18] falls asleep +[1518-06-23 00:53] falls asleep +[1518-06-14 00:07] wakes up +[1518-05-11 23:59] Guard #953 begins shift +[1518-07-13 00:01] Guard #883 begins shift +[1518-10-26 23:58] Guard #2161 begins shift +[1518-03-15 00:49] wakes up +[1518-07-28 23:47] Guard #1619 begins shift +[1518-05-29 00:35] falls asleep +[1518-11-14 00:05] wakes up +[1518-08-06 00:31] falls asleep +[1518-11-02 00:52] wakes up +[1518-05-27 00:41] falls asleep +[1518-05-03 00:14] falls asleep +[1518-04-03 00:00] Guard #1091 begins shift +[1518-09-16 00:46] wakes up +[1518-05-04 23:49] Guard #1607 begins shift +[1518-10-25 00:42] falls asleep +[1518-09-17 00:40] wakes up +[1518-11-09 00:53] wakes up +[1518-07-06 00:07] falls asleep +[1518-06-25 23:54] Guard #1697 begins shift +[1518-05-05 00:59] wakes up +[1518-03-16 00:43] falls asleep +[1518-08-04 00:52] falls asleep +[1518-08-16 00:29] falls asleep +[1518-03-25 23:57] Guard #883 begins shift +[1518-03-18 00:23] falls asleep +[1518-03-09 00:56] wakes up +[1518-11-19 00:45] falls asleep +[1518-03-14 00:56] falls asleep +[1518-09-03 00:30] wakes up +[1518-09-19 00:20] wakes up +[1518-06-21 00:06] falls asleep +[1518-08-28 00:00] Guard #2423 begins shift +[1518-06-04 00:00] falls asleep +[1518-10-28 00:41] wakes up +[1518-07-15 00:32] wakes up +[1518-03-12 00:27] falls asleep +[1518-10-02 00:02] falls asleep +[1518-08-22 00:38] wakes up +[1518-06-22 00:40] wakes up +[1518-09-22 00:47] wakes up +[1518-07-26 00:47] falls asleep +[1518-11-08 00:00] Guard #283 begins shift +[1518-08-16 00:23] wakes up +[1518-04-15 00:51] falls asleep +[1518-07-19 00:38] wakes up +[1518-07-26 00:40] wakes up +[1518-02-24 00:59] wakes up +[1518-08-30 00:00] Guard #2543 begins shift +[1518-07-08 00:23] falls asleep +[1518-11-21 00:43] falls asleep +[1518-04-06 00:01] falls asleep +[1518-11-22 00:48] wakes up +[1518-07-19 00:41] falls asleep +[1518-04-03 00:14] falls asleep +[1518-10-04 00:40] wakes up +[1518-06-23 00:59] wakes up +[1518-10-30 00:53] falls asleep +[1518-05-29 00:00] Guard #2161 begins shift +[1518-11-21 00:53] wakes up +[1518-03-22 00:32] falls asleep +[1518-11-01 00:46] wakes up +[1518-03-21 00:04] Guard #3299 begins shift +[1518-06-11 00:01] falls asleep +[1518-04-12 00:55] wakes up +[1518-03-22 23:59] Guard #613 begins shift +[1518-07-04 00:46] wakes up +[1518-05-20 00:00] Guard #2467 begins shift +[1518-10-26 00:28] wakes up +[1518-03-12 00:50] falls asleep +[1518-11-08 00:20] falls asleep +[1518-04-10 00:32] falls asleep +[1518-09-10 00:24] wakes up +[1518-06-11 00:51] falls asleep +[1518-03-07 00:22] wakes up +[1518-08-26 00:49] falls asleep +[1518-06-01 00:02] Guard #3299 begins shift +[1518-10-29 00:50] wakes up +[1518-07-13 23:50] Guard #1571 begins shift +[1518-06-06 00:37] wakes up +[1518-09-13 00:01] Guard #2467 begins shift +[1518-08-06 00:34] wakes up +[1518-07-20 00:01] Guard #2423 begins shift +[1518-07-09 00:58] wakes up +[1518-04-26 00:34] wakes up +[1518-07-23 00:33] falls asleep +[1518-08-14 00:27] falls asleep +[1518-10-26 00:52] wakes up +[1518-08-08 00:42] falls asleep +[1518-07-29 00:02] falls asleep +[1518-05-16 00:15] falls asleep +[1518-07-18 00:01] Guard #449 begins shift +[1518-06-15 00:37] falls asleep +[1518-11-15 23:56] Guard #883 begins shift +[1518-03-26 00:51] wakes up +[1518-08-04 00:53] wakes up +[1518-07-20 00:46] falls asleep +[1518-09-19 00:02] Guard #883 begins shift +[1518-03-16 23:57] Guard #2423 begins shift +[1518-03-04 00:45] falls asleep +[1518-03-20 00:27] falls asleep +[1518-06-14 00:36] wakes up +[1518-05-09 00:29] wakes up +[1518-04-15 00:06] falls asleep +[1518-10-23 00:02] Guard #2423 begins shift +[1518-10-10 23:58] Guard #3571 begins shift +[1518-09-01 00:13] falls asleep +[1518-04-24 00:39] wakes up +[1518-07-21 00:56] wakes up +[1518-08-16 00:31] wakes up +[1518-04-29 00:50] wakes up +[1518-04-11 00:57] wakes up +[1518-11-14 00:51] falls asleep +[1518-08-15 00:50] wakes up +[1518-04-21 00:40] wakes up +[1518-11-10 00:03] falls asleep +[1518-04-09 00:50] wakes up +[1518-02-26 00:01] Guard #2161 begins shift +[1518-04-03 00:51] wakes up +[1518-04-18 00:53] wakes up +[1518-08-17 00:03] Guard #1597 begins shift +[1518-10-06 00:47] wakes up +[1518-10-30 00:56] wakes up +[1518-10-07 00:20] falls asleep +[1518-08-26 00:32] wakes up +[1518-02-23 23:58] Guard #3571 begins shift +[1518-03-30 00:49] falls asleep +[1518-09-07 23:56] Guard #953 begins shift +[1518-05-02 00:45] wakes up +[1518-03-27 23:57] Guard #1697 begins shift +[1518-06-05 00:04] Guard #3571 begins shift +[1518-09-25 23:59] Guard #283 begins shift +[1518-08-21 00:57] wakes up +[1518-03-06 00:44] falls asleep +[1518-08-11 00:00] Guard #1619 begins shift +[1518-03-24 23:50] Guard #1619 begins shift +[1518-08-23 00:03] Guard #883 begins shift +[1518-07-12 00:38] falls asleep +[1518-10-06 00:21] falls asleep +[1518-10-09 23:57] Guard #2801 begins shift +[1518-07-07 23:59] Guard #3571 begins shift +[1518-09-05 23:54] Guard #3571 begins shift +[1518-04-21 00:56] wakes up +[1518-06-12 00:00] Guard #577 begins shift +[1518-04-20 00:03] Guard #1571 begins shift +[1518-02-23 00:15] falls asleep +[1518-10-09 00:39] wakes up +[1518-11-20 00:11] falls asleep +[1518-03-23 00:41] falls asleep +[1518-11-23 00:01] Guard #613 begins shift +[1518-10-17 00:33] falls asleep +[1518-08-07 00:01] Guard #3571 begins shift +[1518-02-25 00:35] wakes up +[1518-07-22 00:01] Guard #919 begins shift +[1518-09-14 00:56] falls asleep +[1518-06-05 00:27] falls asleep +[1518-08-05 00:05] falls asleep +[1518-10-07 00:49] falls asleep +[1518-11-01 23:59] Guard #1619 begins shift +[1518-08-24 00:00] Guard #449 begins shift +[1518-09-12 00:04] falls asleep +[1518-09-05 00:02] falls asleep +[1518-10-17 00:01] falls asleep +[1518-05-02 00:30] falls asleep +[1518-09-10 23:50] Guard #2161 begins shift +[1518-11-14 00:53] wakes up +[1518-07-03 00:54] wakes up +[1518-02-27 23:57] Guard #1619 begins shift +[1518-08-09 00:31] falls asleep +[1518-11-22 00:29] wakes up +[1518-03-30 00:41] wakes up +[1518-04-02 00:55] wakes up +[1518-05-09 00:54] wakes up +[1518-06-16 00:03] Guard #1597 begins shift +[1518-06-29 23:59] Guard #953 begins shift +[1518-04-30 23:59] Guard #1571 begins shift +[1518-09-08 00:52] wakes up +[1518-06-17 00:00] Guard #1697 begins shift +[1518-08-03 00:59] wakes up +[1518-03-16 00:01] Guard #2543 begins shift +[1518-07-29 00:19] wakes up +[1518-05-11 00:53] wakes up +[1518-10-20 00:36] falls asleep +[1518-04-27 00:55] wakes up +[1518-08-16 00:17] falls asleep +[1518-08-15 00:04] Guard #613 begins shift +[1518-06-02 00:49] falls asleep +[1518-03-19 00:56] wakes up +[1518-04-01 00:03] Guard #1307 begins shift +[1518-05-25 00:00] Guard #1307 begins shift +[1518-09-29 00:00] Guard #2801 begins shift +[1518-08-15 00:49] falls asleep +[1518-11-06 00:02] falls asleep +[1518-03-11 00:02] Guard #1697 begins shift +[1518-09-05 00:28] falls asleep +[1518-03-12 00:32] wakes up +[1518-07-12 00:21] wakes up +[1518-04-12 00:25] falls asleep +[1518-10-18 00:18] falls asleep +[1518-03-04 00:04] Guard #2423 begins shift +[1518-04-21 00:15] falls asleep +[1518-03-04 00:57] wakes up +[1518-11-11 23:56] Guard #577 begins shift +[1518-10-07 00:51] wakes up +[1518-11-02 00:06] falls asleep +[1518-06-08 00:59] wakes up +[1518-03-30 00:04] Guard #953 begins shift +[1518-09-18 00:24] falls asleep +[1518-07-29 00:15] wakes up +[1518-03-31 00:45] wakes up +[1518-07-29 00:38] wakes up +[1518-11-16 00:54] wakes up +[1518-08-13 00:53] wakes up +[1518-04-16 23:57] Guard #1619 begins shift +[1518-11-22 00:05] falls asleep +[1518-10-30 00:05] falls asleep +[1518-03-08 00:17] falls asleep +[1518-07-25 00:31] wakes up +[1518-05-25 00:25] falls asleep +[1518-06-10 00:19] falls asleep +[1518-11-07 00:49] wakes up +[1518-04-20 00:58] wakes up +[1518-07-17 00:29] wakes up +[1518-10-03 00:16] falls asleep +[1518-04-22 00:54] falls asleep +[1518-07-02 00:02] Guard #1619 begins shift +[1518-03-29 00:04] Guard #1697 begins shift +[1518-05-07 23:59] Guard #577 begins shift +[1518-09-23 00:47] falls asleep +[1518-07-27 23:57] Guard #1597 begins shift +[1518-08-07 00:36] falls asleep +[1518-06-29 00:04] wakes up +[1518-06-19 00:29] falls asleep +[1518-08-01 00:03] falls asleep +[1518-10-12 00:56] wakes up +[1518-09-01 00:18] wakes up +[1518-06-19 00:02] Guard #2543 begins shift +[1518-10-03 00:53] wakes up +[1518-10-09 00:07] falls asleep +[1518-02-26 00:47] wakes up +[1518-08-25 23:59] Guard #1607 begins shift +[1518-11-13 23:50] Guard #2801 begins shift +[1518-06-10 00:02] Guard #2801 begins shift +[1518-07-10 00:05] falls asleep +[1518-03-12 00:56] wakes up +[1518-09-06 00:54] wakes up +[1518-04-26 23:52] Guard #2161 begins shift +[1518-09-08 00:42] falls asleep +[1518-04-29 23:49] Guard #2801 begins shift +[1518-09-02 00:49] wakes up +[1518-09-25 00:00] Guard #1697 begins shift +[1518-10-10 00:52] falls asleep +[1518-08-23 00:55] wakes up +[1518-10-07 23:58] Guard #919 begins shift +[1518-03-27 00:09] falls asleep +[1518-07-10 00:49] wakes up +[1518-05-24 00:00] Guard #2467 begins shift +[1518-07-03 00:02] Guard #883 begins shift +[1518-07-09 00:41] falls asleep +[1518-11-08 00:43] falls asleep +[1518-10-10 00:48] falls asleep +[1518-09-07 00:32] falls asleep +[1518-04-30 00:37] falls asleep +[1518-07-15 00:51] falls asleep +[1518-07-10 23:58] Guard #2543 begins shift +[1518-04-27 00:20] wakes up +[1518-02-26 00:59] wakes up +[1518-11-13 00:01] falls asleep +[1518-03-28 00:34] falls asleep +[1518-10-18 00:52] wakes up +[1518-06-25 00:01] falls asleep +[1518-05-06 00:49] falls asleep +[1518-04-16 00:17] falls asleep +[1518-08-10 00:50] falls asleep +[1518-10-17 00:27] wakes up +[1518-06-27 00:05] falls asleep +[1518-08-31 00:25] falls asleep +[1518-04-02 00:44] wakes up +[1518-05-31 00:53] wakes up +[1518-04-19 00:04] falls asleep +[1518-03-12 23:49] Guard #1697 begins shift +[1518-11-12 23:52] Guard #953 begins shift +[1518-04-15 00:01] Guard #1697 begins shift +[1518-09-10 00:21] falls asleep +[1518-02-22 23:58] Guard #2543 begins shift +[1518-06-20 00:03] Guard #449 begins shift +[1518-10-06 00:15] wakes up +[1518-06-21 00:00] Guard #2161 begins shift +[1518-09-26 00:57] wakes up +[1518-03-20 00:00] Guard #2423 begins shift +[1518-03-01 00:36] falls asleep +[1518-07-23 00:59] wakes up +[1518-08-03 00:39] falls asleep +[1518-06-23 00:45] wakes up +[1518-05-20 00:25] falls asleep +[1518-07-16 00:57] wakes up +[1518-11-05 00:17] falls asleep +[1518-09-25 00:32] falls asleep +[1518-03-05 00:45] falls asleep +[1518-05-08 23:56] Guard #2423 begins shift +[1518-06-18 00:29] falls asleep +[1518-08-20 23:58] Guard #1571 begins shift +[1518-11-14 23:57] Guard #883 begins shift +[1518-07-08 00:26] wakes up +[1518-09-02 00:00] Guard #1571 begins shift +[1518-07-16 23:56] Guard #1571 begins shift +[1518-11-14 00:47] wakes up +[1518-07-25 00:02] Guard #449 begins shift +[1518-11-23 00:55] wakes up +[1518-10-13 00:48] wakes up +[1518-04-15 00:18] wakes up +[1518-03-24 00:28] falls asleep +[1518-07-18 00:39] falls asleep +[1518-04-16 00:25] falls asleep +[1518-10-24 00:38] falls asleep +[1518-06-18 00:00] Guard #1091 begins shift +[1518-11-19 00:50] wakes up +[1518-04-02 00:00] Guard #1607 begins shift +[1518-10-24 00:50] wakes up +[1518-04-18 00:33] wakes up +[1518-10-08 00:54] falls asleep +[1518-05-17 00:54] wakes up +[1518-05-19 00:48] wakes up +[1518-08-26 00:16] falls asleep +[1518-10-10 00:13] falls asleep +[1518-09-16 23:59] Guard #919 begins shift +[1518-10-13 00:54] falls asleep +[1518-08-16 00:04] Guard #2467 begins shift +[1518-06-05 00:39] wakes up +[1518-04-13 00:03] Guard #613 begins shift +[1518-10-26 00:45] wakes up +[1518-04-03 23:58] Guard #953 begins shift +[1518-05-06 00:53] wakes up +[1518-06-22 00:00] Guard #1697 begins shift +[1518-07-28 00:31] wakes up +[1518-10-13 00:55] wakes up +[1518-06-16 00:57] wakes up +[1518-08-05 00:09] wakes up +[1518-10-10 00:58] wakes up +[1518-09-15 00:00] Guard #613 begins shift +[1518-05-03 00:01] Guard #1619 begins shift +[1518-08-20 00:04] Guard #883 begins shift +[1518-03-08 00:55] wakes up +[1518-07-17 00:48] falls asleep +[1518-09-14 00:47] falls asleep +[1518-07-24 00:37] falls asleep +[1518-02-27 00:48] falls asleep +[1518-05-03 00:53] wakes up +[1518-09-27 23:58] Guard #1571 begins shift +[1518-03-25 00:59] wakes up +[1518-05-30 00:51] falls asleep +[1518-03-25 00:47] wakes up +[1518-04-13 00:08] falls asleep +[1518-06-10 00:22] wakes up +[1518-06-03 00:12] falls asleep +[1518-10-23 00:07] falls asleep +[1518-09-04 00:03] Guard #3299 begins shift +[1518-03-05 00:39] wakes up +[1518-04-26 00:15] falls asleep +[1518-09-22 00:02] Guard #1597 begins shift +[1518-11-11 00:36] falls asleep +[1518-08-29 00:26] falls asleep +[1518-07-19 00:04] falls asleep +[1518-03-05 00:59] wakes up +[1518-11-10 00:10] wakes up +[1518-08-19 00:33] falls asleep +[1518-06-10 23:48] Guard #2467 begins shift +[1518-07-02 00:52] wakes up +[1518-09-05 00:58] wakes up +[1518-10-29 00:21] falls asleep +[1518-08-31 00:31] wakes up +[1518-03-11 00:30] falls asleep +[1518-06-19 00:40] wakes up +[1518-11-20 00:00] Guard #613 begins shift +[1518-03-27 00:32] wakes up +[1518-10-28 00:44] falls asleep +[1518-02-27 00:18] falls asleep +[1518-05-15 00:51] wakes up +[1518-05-31 00:58] wakes up +[1518-06-26 23:47] Guard #3299 begins shift +[1518-06-06 23:59] Guard #1091 begins shift +[1518-07-11 00:56] wakes up +[1518-10-16 00:30] falls asleep +[1518-05-19 00:03] falls asleep +[1518-10-19 00:45] falls asleep +[1518-10-09 00:04] Guard #283 begins shift +[1518-05-13 00:54] wakes up +[1518-05-07 00:56] falls asleep +[1518-04-19 00:55] wakes up +[1518-05-28 00:16] falls asleep +[1518-09-17 00:29] falls asleep +[1518-06-13 00:04] Guard #3299 begins shift +[1518-06-14 00:05] falls asleep +[1518-04-27 00:25] falls asleep +[1518-03-11 00:39] wakes up +[1518-04-17 00:52] falls asleep +[1518-11-09 23:51] Guard #3299 begins shift +[1518-09-27 00:04] falls asleep +[1518-05-16 00:48] wakes up +[1518-03-24 00:46] wakes up +[1518-05-11 00:03] Guard #883 begins shift +[1518-02-24 00:20] falls asleep +[1518-03-28 00:53] falls asleep +[1518-04-17 00:35] wakes up +[1518-08-08 00:00] Guard #2801 begins shift +[1518-05-15 00:17] falls asleep +[1518-10-21 00:03] falls asleep +[1518-06-05 00:45] falls asleep +[1518-09-02 00:55] wakes up +[1518-03-30 00:35] falls asleep +[1518-06-16 00:26] falls asleep +[1518-02-25 00:08] falls asleep +[1518-10-19 00:00] Guard #2801 begins shift +[1518-05-29 00:59] wakes up +[1518-08-31 00:18] wakes up +[1518-08-02 00:04] Guard #283 begins shift +[1518-07-24 00:34] wakes up +[1518-07-02 00:31] falls asleep +[1518-06-23 00:00] Guard #449 begins shift +[1518-03-14 23:58] Guard #1619 begins shift +[1518-08-30 23:50] Guard #919 begins shift +[1518-04-30 00:21] wakes up +[1518-04-27 00:04] falls asleep +[1518-08-24 00:59] wakes up +[1518-08-31 23:56] Guard #1619 begins shift +[1518-05-25 23:59] Guard #449 begins shift +[1518-08-04 23:50] Guard #3299 begins shift +[1518-11-03 00:50] falls asleep +[1518-06-03 00:39] wakes up +[1518-06-17 00:25] falls asleep +[1518-09-16 00:55] wakes up +[1518-11-02 23:57] Guard #613 begins shift +[1518-05-14 00:04] Guard #1597 begins shift +[1518-03-19 00:54] falls asleep +[1518-03-02 00:50] wakes up +[1518-06-03 23:53] Guard #2161 begins shift +[1518-10-05 00:03] Guard #157 begins shift +[1518-09-08 00:32] wakes up +[1518-10-04 00:21] falls asleep +[1518-10-02 00:18] wakes up +[1518-07-04 23:57] Guard #1307 begins shift +[1518-06-05 00:54] wakes up +[1518-04-05 00:31] falls asleep +[1518-06-24 23:47] Guard #2161 begins shift +[1518-07-07 00:00] Guard #1571 begins shift +[1518-08-11 00:35] wakes up +[1518-03-05 23:51] Guard #2801 begins shift +[1518-08-25 00:41] falls asleep +[1518-08-28 00:27] falls asleep +[1518-10-31 00:24] falls asleep +[1518-10-29 23:46] Guard #1091 begins shift +[1518-02-28 23:54] Guard #2161 begins shift +[1518-06-08 23:59] Guard #577 begins shift +[1518-06-28 23:52] Guard #883 begins shift +[1518-04-25 00:34] wakes up +[1518-03-01 00:25] wakes up +[1518-03-25 00:52] falls asleep +[1518-06-13 00:55] wakes up +[1518-07-01 00:12] falls asleep +[1518-11-08 23:56] Guard #449 begins shift +[1518-07-17 00:51] wakes up +[1518-05-18 00:59] wakes up +[1518-06-16 00:45] falls asleep +[1518-07-20 00:18] falls asleep +[1518-07-23 23:56] Guard #1619 begins shift +[1518-06-15 00:57] wakes up +[1518-11-14 00:03] falls asleep +[1518-08-03 00:45] wakes up +[1518-03-08 00:00] Guard #1697 begins shift +[1518-04-14 00:59] wakes up +[1518-09-28 00:39] wakes up +[1518-06-06 00:53] falls asleep +[1518-05-17 00:36] falls asleep +[1518-04-16 00:46] falls asleep +[1518-07-12 00:59] wakes up +[1518-08-11 00:33] falls asleep +[1518-09-23 00:58] wakes up +[1518-08-22 00:45] wakes up +[1518-09-24 00:07] falls asleep +[1518-05-16 00:57] wakes up +[1518-04-24 23:59] Guard #2543 begins shift +[1518-06-15 00:52] falls asleep +[1518-07-29 00:23] falls asleep +[1518-08-13 00:32] wakes up +[1518-06-03 00:01] Guard #1091 begins shift +[1518-06-11 00:36] falls asleep +[1518-10-01 00:00] falls asleep +[1518-03-02 00:34] falls asleep +[1518-05-09 23:56] Guard #2467 begins shift +[1518-03-05 00:06] falls asleep +[1518-06-02 00:54] falls asleep +[1518-06-02 00:01] Guard #1091 begins shift +[1518-07-18 23:49] Guard #1597 begins shift +[1518-04-01 00:48] wakes up +[1518-04-07 00:54] falls asleep +[1518-10-28 00:50] wakes up +[1518-05-25 00:57] wakes up +[1518-11-04 00:57] falls asleep +[1518-09-11 00:55] wakes up +[1518-09-14 00:59] wakes up +[1518-08-31 00:52] wakes up +[1518-10-05 23:54] Guard #1697 begins shift +[1518-07-17 00:57] falls asleep +[1518-04-16 00:22] wakes up +[1518-06-30 00:09] falls asleep +[1518-09-15 23:56] Guard #3571 begins shift +[1518-11-15 00:46] wakes up +[1518-09-27 00:50] wakes up +[1518-11-05 00:02] Guard #1697 begins shift +[1518-09-24 00:16] wakes up +[1518-05-07 00:57] wakes up +[1518-05-01 00:58] wakes up +[1518-05-26 00:06] falls asleep +[1518-03-09 00:40] falls asleep +[1518-08-03 00:57] falls asleep +[1518-03-17 23:59] Guard #1697 begins shift +[1518-04-15 00:35] falls asleep +[1518-08-09 00:35] wakes up +[1518-05-07 00:02] Guard #1571 begins shift +[1518-04-11 00:01] Guard #953 begins shift +[1518-09-12 00:42] falls asleep +[1518-04-18 00:30] falls asleep +[1518-11-14 00:08] falls asleep +[1518-05-05 00:01] falls asleep +[1518-03-01 00:01] falls asleep +[1518-05-22 00:16] falls asleep +[1518-08-27 00:45] wakes up +[1518-11-11 00:00] Guard #3571 begins shift +[1518-03-10 00:09] falls asleep +[1518-04-21 23:56] Guard #883 begins shift +[1518-09-23 00:04] Guard #2423 begins shift +[1518-03-27 00:48] falls asleep +[1518-10-20 00:20] wakes up +[1518-10-04 00:04] Guard #953 begins shift +[1518-10-24 00:07] falls asleep +[1518-07-26 00:01] Guard #1607 begins shift +[1518-07-09 23:47] Guard #2423 begins shift +[1518-06-08 00:54] falls asleep +[1518-09-18 00:29] wakes up +[1518-07-03 00:06] falls asleep +[1518-09-13 00:39] wakes up +[1518-03-10 00:03] Guard #1619 begins shift +[1518-06-15 00:03] Guard #2543 begins shift +[1518-06-30 00:37] falls asleep +[1518-09-23 23:56] Guard #1091 begins shift +[1518-04-19 00:45] falls asleep +[1518-11-08 00:32] wakes up +[1518-05-09 00:41] falls asleep +[1518-08-28 00:52] wakes up +[1518-11-17 00:01] falls asleep +[1518-06-02 00:51] wakes up +[1518-06-29 00:43] falls asleep +[1518-06-11 00:38] wakes up +[1518-10-06 00:04] falls asleep +[1518-09-26 00:54] falls asleep +[1518-10-13 00:43] falls asleep +[1518-08-13 00:39] falls asleep +[1518-06-10 00:41] falls asleep +[1518-08-07 00:40] wakes up +[1518-10-01 00:56] wakes up +[1518-10-19 00:42] wakes up +[1518-03-06 00:02] falls asleep +[1518-08-29 00:01] Guard #1619 begins shift +[1518-08-04 00:17] falls asleep +[1518-07-30 00:00] Guard #953 begins shift +[1518-04-30 00:01] falls asleep +[1518-05-01 00:33] falls asleep +[1518-08-08 23:57] Guard #283 begins shift +[1518-06-25 00:41] wakes up +[1518-09-10 00:04] Guard #1571 begins shift +[1518-03-10 00:39] wakes up +[1518-06-22 00:29] falls asleep +[1518-03-14 00:39] falls asleep +[1518-04-23 23:52] Guard #1571 begins shift +[1518-10-31 00:58] wakes up +[1518-05-03 00:16] wakes up +[1518-08-31 00:43] falls asleep +[1518-07-17 00:10] falls asleep +[1518-07-25 00:18] falls asleep +[1518-06-26 00:29] falls asleep +[1518-06-02 00:59] wakes up +[1518-03-07 00:04] Guard #953 begins shift +[1518-11-19 00:18] falls asleep +[1518-06-06 00:47] falls asleep +[1518-04-05 23:46] Guard #3299 begins shift +[1518-05-13 00:01] falls asleep +[1518-03-03 00:23] falls asleep +[1518-04-24 00:59] wakes up +[1518-09-04 00:36] wakes up +[1518-11-03 00:58] wakes up +[1518-04-07 00:58] wakes up +[1518-03-22 00:22] wakes up +[1518-02-23 00:41] wakes up +[1518-07-06 00:21] wakes up +[1518-06-27 00:22] falls asleep +[1518-08-29 00:33] wakes up +[1518-03-13 00:04] falls asleep +[1518-02-26 23:57] Guard #613 begins shift +[1518-09-25 00:49] wakes up +[1518-10-22 00:41] falls asleep +[1518-03-22 00:20] falls asleep +[1518-08-14 00:03] Guard #2801 begins shift +[1518-07-13 00:56] wakes up +[1518-07-30 00:40] falls asleep +[1518-06-21 00:43] wakes up +[1518-09-06 00:37] falls asleep +[1518-03-29 00:40] falls asleep +[1518-05-15 00:44] falls asleep +[1518-08-06 00:53] falls asleep +[1518-08-09 00:46] falls asleep +[1518-03-16 00:59] wakes up +[1518-07-11 00:39] falls asleep +[1518-10-19 00:34] falls asleep +[1518-07-22 00:55] wakes up +[1518-02-25 00:01] Guard #1697 begins shift +[1518-08-17 00:47] wakes up +[1518-09-22 00:35] falls asleep +[1518-08-14 00:29] wakes up +[1518-03-31 00:09] falls asleep +[1518-10-28 00:03] Guard #1597 begins shift +[1518-11-15 00:29] falls asleep +[1518-05-20 00:43] wakes up +[1518-02-28 00:42] wakes up +[1518-08-12 00:55] wakes up +[1518-07-01 00:29] wakes up +[1518-06-28 00:54] falls asleep +[1518-04-16 00:35] wakes up +[1518-06-27 23:58] Guard #1571 begins shift +[1518-10-27 00:36] falls asleep +[1518-09-14 00:02] Guard #1619 begins shift +[1518-11-10 00:50] wakes up +[1518-10-25 00:15] falls asleep +[1518-05-02 00:00] Guard #3299 begins shift +[1518-05-31 00:28] falls asleep +[1518-06-01 00:17] falls asleep +[1518-09-12 00:44] wakes up +[1518-06-05 00:58] wakes up +[1518-04-05 00:46] wakes up +[1518-07-22 23:56] Guard #283 begins shift +[1518-06-26 00:58] wakes up +[1518-10-29 00:00] Guard #953 begins shift +[1518-04-06 00:53] wakes up +[1518-02-26 00:54] falls asleep +[1518-10-17 23:58] Guard #283 begins shift +[1518-09-02 00:52] falls asleep +[1518-05-30 00:01] Guard #1091 begins shift +[1518-07-15 00:56] wakes up +[1518-10-31 00:00] Guard #953 begins shift +[1518-04-02 00:32] falls asleep +[1518-11-13 00:57] wakes up +[1518-11-17 23:58] Guard #2467 begins shift +[1518-04-01 00:29] falls asleep +[1518-07-28 00:16] falls asleep +[1518-10-01 00:12] wakes up +[1518-07-11 23:58] Guard #1091 begins shift +[1518-04-17 00:57] wakes up +[1518-06-13 00:51] falls asleep +[1518-07-06 00:02] Guard #3299 begins shift +[1518-06-23 00:37] falls asleep +[1518-08-02 00:18] falls asleep +[1518-08-09 00:58] wakes up +[1518-04-06 23:57] Guard #449 begins shift +[1518-08-19 00:00] Guard #1619 begins shift +[1518-04-15 00:59] wakes up +[1518-04-26 00:04] Guard #1619 begins shift +[1518-05-05 00:47] falls asleep +[1518-04-22 00:33] wakes up +[1518-11-01 00:07] falls asleep +[1518-03-03 00:03] Guard #2543 begins shift +[1518-09-30 00:57] wakes up +[1518-06-28 00:51] wakes up +[1518-11-19 00:36] wakes up +[1518-06-13 23:50] Guard #449 begins shift +[1518-03-30 00:30] wakes up +[1518-04-05 00:25] wakes up +[1518-04-11 00:40] falls asleep +[1518-03-17 00:56] wakes up +[1518-06-03 00:49] falls asleep +[1518-03-21 00:11] falls asleep +[1518-08-24 23:56] Guard #2801 begins shift +[1518-07-31 23:48] Guard #2801 begins shift +[1518-06-20 00:56] wakes up +[1518-05-27 00:51] wakes up +[1518-08-22 00:42] falls asleep +[1518-09-06 00:04] falls asleep +[1518-10-26 00:06] falls asleep +[1518-11-06 23:57] Guard #2423 begins shift +[1518-10-25 00:39] wakes up +[1518-04-16 00:04] Guard #1619 begins shift +[1518-04-19 00:36] wakes up +[1518-08-01 00:17] wakes up +[1518-04-22 23:57] Guard #577 begins shift +[1518-08-08 00:26] wakes up +[1518-07-05 00:45] wakes up +[1518-04-17 23:58] Guard #2467 begins shift +[1518-03-12 00:00] Guard #919 begins shift +[1518-04-04 23:47] Guard #2161 begins shift +[1518-11-17 00:58] wakes up +[1518-04-15 00:53] wakes up +[1518-11-20 00:29] wakes up +[1518-11-11 00:54] wakes up +[1518-08-10 00:04] Guard #283 begins shift +[1518-05-01 00:26] wakes up +[1518-04-29 00:23] falls asleep +[1518-03-15 00:19] falls asleep +[1518-07-15 00:20] falls asleep +[1518-08-19 00:34] wakes up +[1518-04-10 00:48] wakes up +[1518-11-21 23:46] Guard #919 begins shift +[1518-07-14 00:53] falls asleep +[1518-07-27 00:58] wakes up +[1518-07-20 00:51] wakes up +[1518-04-24 00:05] falls asleep +[1518-07-09 00:00] Guard #2801 begins shift +[1518-09-30 00:27] falls asleep +[1518-11-06 00:50] wakes up +[1518-04-09 00:34] wakes up +[1518-08-05 00:49] wakes up +[1518-08-30 00:49] wakes up +[1518-06-14 00:18] falls asleep +[1518-10-15 00:34] falls asleep +[1518-07-13 00:51] falls asleep +[1518-04-18 00:37] falls asleep +[1518-03-09 00:02] Guard #449 begins shift +[1518-11-09 00:16] falls asleep +[1518-10-04 00:59] wakes up +[1518-04-30 00:42] wakes up +[1518-10-16 23:52] Guard #613 begins shift +[1518-10-21 00:46] wakes up +[1518-05-23 00:01] falls asleep +[1518-08-26 23:56] Guard #2161 begins shift +[1518-08-05 00:16] falls asleep +[1518-06-18 00:55] wakes up +[1518-11-16 23:50] Guard #919 begins shift +[1518-10-14 23:59] Guard #1571 begins shift +[1518-07-06 00:28] falls asleep +[1518-05-06 00:33] falls asleep +[1518-04-22 00:19] falls asleep +[1518-03-22 00:03] Guard #953 begins shift +[1518-06-10 00:46] wakes up +[1518-05-27 00:04] Guard #2801 begins shift +[1518-11-03 00:20] falls asleep +[1518-10-26 00:01] Guard #1597 begins shift +[1518-10-30 00:26] wakes up +[1518-10-10 00:39] wakes up +[1518-06-11 00:58] wakes up +[1518-09-26 00:38] wakes up +[1518-08-12 00:29] falls asleep +[1518-03-25 00:03] falls asleep +[1518-09-22 00:18] falls asleep +[1518-08-24 00:23] falls asleep +[1518-04-09 00:22] falls asleep +[1518-08-12 00:02] Guard #1597 begins shift +[1518-08-30 00:41] falls asleep +[1518-04-13 23:59] Guard #2801 begins shift +[1518-09-28 00:06] falls asleep +[1518-06-29 00:01] falls asleep +[1518-07-15 00:00] Guard #883 begins shift +[1518-03-14 00:53] wakes up +[1518-04-29 00:02] Guard #3299 begins shift +[1518-05-03 23:58] Guard #577 begins shift +[1518-09-09 00:57] wakes up +[1518-05-14 00:50] wakes up +[1518-10-08 00:58] wakes up +[1518-06-07 00:29] wakes up +[1518-07-02 00:36] wakes up +[1518-11-18 23:56] Guard #1307 begins shift +[1518-07-21 00:03] Guard #2423 begins shift +[1518-10-11 00:22] falls asleep +[1518-05-14 00:27] falls asleep +[1518-09-17 00:58] wakes up +[1518-08-28 00:41] falls asleep +[1518-04-11 23:59] Guard #1597 begins shift +[1518-05-31 00:02] Guard #1607 begins shift +[1518-10-21 23:58] Guard #1307 begins shift +[1518-08-13 00:00] Guard #1607 begins shift +[1518-05-23 00:47] wakes up +[1518-08-08 00:57] wakes up +[1518-04-08 00:04] falls asleep +[1518-08-05 00:21] wakes up +[1518-04-22 00:57] wakes up +[1518-10-07 00:00] Guard #3299 begins shift +[1518-05-18 00:55] falls asleep +[1518-05-29 00:28] wakes up +[1518-07-20 00:39] wakes up +[1518-08-25 00:21] falls asleep +[1518-03-06 00:26] wakes up +[1518-11-05 23:47] Guard #1307 begins shift +[1518-07-29 00:18] falls asleep +[1518-04-14 00:33] falls asleep +[1518-08-02 00:50] wakes up +[1518-10-01 00:19] falls asleep +[1518-05-11 00:31] falls asleep +[1518-07-06 00:51] falls asleep +[1518-11-04 00:59] wakes up +[1518-09-11 23:53] Guard #919 begins shift +[1518-07-21 00:38] falls asleep +[1518-05-31 00:56] falls asleep +[1518-06-06 00:54] wakes up +[1518-11-10 00:23] falls asleep +[1518-06-30 00:27] wakes up +[1518-08-18 00:33] falls asleep +[1518-07-02 00:51] falls asleep +[1518-05-27 23:57] Guard #1619 begins shift +[1518-10-04 00:53] falls asleep +[1518-11-03 23:59] Guard #1597 begins shift +[1518-04-08 00:56] wakes up +[1518-09-11 00:05] falls asleep +[1518-06-30 00:54] wakes up +[1518-06-24 00:06] falls asleep +[1518-08-15 00:11] falls asleep +[1518-10-15 00:59] wakes up +[1518-08-17 00:15] falls asleep +[1518-05-10 00:58] wakes up +[1518-05-22 00:41] wakes up +[1518-07-30 00:57] wakes up +[1518-06-06 00:32] falls asleep +[1518-06-26 00:24] wakes up +[1518-10-24 00:09] wakes up +[1518-07-17 00:58] wakes up +[1518-06-11 00:26] wakes up +[1518-05-27 00:28] wakes up +[1518-07-18 00:59] wakes up +[1518-10-19 23:54] Guard #613 begins shift +[1518-10-17 00:58] wakes up +[1518-08-18 00:51] wakes up +[1518-05-10 00:34] falls asleep +[1518-05-24 00:07] falls asleep +[1518-08-25 00:53] wakes up +[1518-05-18 00:00] Guard #449 begins shift +[1518-10-20 00:05] falls asleep +[1518-06-29 00:49] wakes up +[1518-04-17 00:30] falls asleep +[1518-06-25 00:22] wakes up +[1518-09-08 23:59] Guard #1571 begins shift +[1518-03-23 00:49] wakes up +[1518-04-07 23:54] Guard #2467 begins shift +[1518-03-04 23:57] Guard #1571 begins shift +[1518-11-07 00:34] falls asleep +[1518-09-17 23:59] Guard #1697 begins shift +[1518-05-16 00:04] Guard #2801 begins shift +[1518-11-05 00:43] wakes up +[1518-03-18 00:42] wakes up +[1518-09-03 00:23] falls asleep +[1518-10-14 00:36] falls asleep +[1518-09-17 00:46] falls asleep +[1518-08-31 00:05] falls asleep +[1518-07-31 00:22] falls asleep +[1518-07-05 00:50] falls asleep +[1518-03-17 00:43] falls asleep +[1518-06-24 00:42] wakes up +[1518-06-01 00:33] wakes up +[1518-06-27 00:45] wakes up +[1518-02-26 00:21] falls asleep +[1518-10-20 00:47] wakes up +[1518-08-13 00:56] falls asleep +[1518-05-17 00:03] Guard #1307 begins shift +[1518-03-13 00:28] wakes up +[1518-11-21 00:04] Guard #449 begins shift +[1518-04-30 00:48] falls asleep +[1518-10-12 00:05] falls asleep +[1518-07-31 00:34] wakes up +[1518-09-16 00:50] falls asleep +[1518-07-27 00:09] falls asleep +[1518-05-29 00:25] falls asleep +[1518-10-07 00:42] wakes up +[1518-10-27 00:38] wakes up +[1518-06-15 00:41] wakes up +[1518-06-24 00:04] Guard #3571 begins shift +[1518-10-19 00:53] wakes up +[1518-09-26 23:52] Guard #1597 begins shift +[1518-05-21 00:48] wakes up +[1518-06-17 00:42] wakes up +[1518-03-27 00:51] wakes up +[1518-05-12 00:33] wakes up +[1518-08-08 00:19] falls asleep +[1518-07-14 00:57] wakes up +[1518-09-06 23:56] Guard #449 begins shift +[1518-08-10 00:55] wakes up +[1518-05-27 00:24] falls asleep +[1518-09-30 23:49] Guard #449 begins shift +[1518-10-28 00:40] falls asleep +[1518-02-27 00:53] wakes up +[1518-09-08 00:14] falls asleep +[1518-08-13 00:59] wakes up +[1518-05-15 00:37] wakes up +[1518-02-27 00:40] wakes up +[1518-10-23 00:43] wakes up +[1518-04-06 00:24] wakes up +[1518-07-16 00:27] falls asleep +[1518-06-03 00:52] wakes up +[1518-10-26 00:49] falls asleep +[1518-11-03 00:45] wakes up +[1518-08-05 00:27] falls asleep +[1518-04-28 00:32] falls asleep +[1518-05-06 00:04] Guard #919 begins shift +[1518-11-23 00:39] falls asleep +[1518-09-15 00:38] falls asleep +[1518-03-21 00:29] wakes up +[1518-10-26 00:35] falls asleep +[1518-08-20 00:49] falls asleep +[1518-08-10 00:19] falls asleep +[1518-09-26 00:36] falls asleep +[1518-09-29 00:14] falls asleep +[1518-05-30 00:52] wakes up +[1518-03-19 00:02] Guard #919 begins shift +[1518-10-15 00:18] wakes up +[1518-08-22 00:02] Guard #2161 begins shift +[1518-08-20 00:54] wakes up +[1518-07-19 00:57] wakes up +[1518-10-02 23:58] Guard #919 begins shift +[1518-07-06 00:53] wakes up +[1518-04-04 00:22] falls asleep +[1518-10-11 00:47] wakes up +[1518-06-20 00:13] falls asleep +[1518-03-26 00:49] falls asleep +[1518-09-14 00:33] falls asleep +[1518-08-04 00:00] Guard #283 begins shift +[1518-07-27 00:02] Guard #1571 begins shift +[1518-02-28 00:11] falls asleep +[1518-08-28 00:36] wakes up +[1518-10-14 00:52] wakes up +[1518-05-17 00:31] wakes up +[1518-10-07 00:24] wakes up +[1518-09-05 00:25] wakes up +[1518-10-13 00:02] Guard #1571 begins shift +[1518-08-06 00:56] wakes up +[1518-09-04 23:47] Guard #3299 begins shift +[1518-03-30 00:21] falls asleep +[1518-04-18 23:48] Guard #3571 begins shift +[1518-05-18 23:47] Guard #2801 begins shift +[1518-05-01 00:15] falls asleep +[1518-06-28 00:27] falls asleep +[1518-10-01 23:47] Guard #449 begins shift +[1518-06-26 00:00] falls asleep +[1518-10-20 23:52] Guard #953 begins shift +[1518-11-01 00:04] Guard #449 begins shift diff --git a/test/day4_test.exs b/test/day4_test.exs new file mode 100644 index 0000000..74e0e60 --- /dev/null +++ b/test/day4_test.exs @@ -0,0 +1,83 @@ +defmodule Day4Test do + use ExUnit.Case + doctest Day4 + alias Day4.Timestamp + + test "parse event" do + assert Day4.parse_event("[1518-11-01 00:00] Guard #10 begins shift") == {%Timestamp{year: 1518, month: 11, day: 01, hour: 0, minute: 0}, "Guard #10 begins shift"} + end + + test "parse guard" do + event = {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 00}, "Guard #10 begins shift"} + assert Day4.parse_guard(event) == "10" + end + + test "sort events" do + events = [ + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 05}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 55}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 25}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 00}, "Guard #10 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 30}, "falls asleep"} + ] + + assert Day4.sort_events(events) == [ + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 00}, "Guard #10 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 05}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 25}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 30}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 01, hour: 00, minute: 55}, "wakes up"} + ] + end + + test "get sleep times" do + events = [ + {%Timestamp{year: 1518, month: 11, day: 1, hour: 0, minute: 0}, "Guard #10 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 1, hour: 0, minute: 5}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 1, hour: 0, minute: 25}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 1, hour: 0, minute: 30}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 1, hour: 0, minute: 55}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 1, hour: 23, minute: 58}, "Guard #99 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 2, hour: 0, minute: 40}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 2, hour: 0, minute: 50}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 3, hour: 0, minute: 5}, "Guard #10 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 3, hour: 0, minute: 24}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 3, hour: 0, minute: 29}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 4, hour: 0, minute: 2}, "Guard #99 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 4, hour: 0, minute: 36}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 4, hour: 0, minute: 46}, "wakes up"}, + {%Timestamp{year: 1518, month: 11, day: 5, hour: 0, minute: 3}, "Guard #99 begins shift"}, + {%Timestamp{year: 1518, month: 11, day: 5, hour: 0, minute: 45}, "falls asleep"}, + {%Timestamp{year: 1518, month: 11, day: 5, hour: 0, minute: 55}, "wakes up"} + ] + + assert Day4.get_sleep_times(events) == [ + {"10", [5..25, 30..55, 24..29]}, + {"99", [40..50, 36..46, 45..55]} + ] + end + + test "get max sleep time" do + guards = [ + {"10", [5..25, 30..55, 24..29]}, + {"99", [40..50, 36..46, 45..55]} + ] + + assert Day4.get_max_sleep_time(guards) == {"10", 50, 24} + end + + test "range containing" do + assert Day4.range_containing([5..25, 30..55, 24..29]) == 5..55 + assert Day4.range_containing([40..50, 36..46, 45..55]) == 36..55 + end + + test "most frequent sleep time" do + guards = [ + {"10", [5..25, 30..55, 24..29]}, + {"99", [40..50, 36..46, 45..55]} + ] + + assert Day4.get_most_frequent_sleep_time(guards) == {"99", 45, 3} + end + +end \ No newline at end of file