diff --git a/2018/day4/day4.py b/2018/day4/day4.py new file mode 100644 index 0000000..e6aded4 --- /dev/null +++ b/2018/day4/day4.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +import re +from collections import defaultdict, Counter +from pprint import pprint + + +def main(inp): + # total minutes asleep per guard + guards = defaultdict(int) + # list of guards sleeping for each minute + minutes = defaultdict(lambda: defaultdict(int)) + for l in sorted(inp): + minute = re.search(r":(\d+)", l).group(1) + if "#" in l: + current_id = re.search(r"#(\d+)", l).group(1) + elif "asleep" in l: + start = int(minute) + elif "wakes" in l: + end = int(minute) + guards[current_id] += end - start + for m in range(start, end): + minutes[m][current_id] += 1 + + # Find the guard that has the most minutes asleep. What minute does that guard spend asleep the most? + guard_id = max(guards.items(), key=lambda x: x[1])[0] + minute = max([(k, v[guard_id]) for k, v in minutes.items() if guard_id in v], key=lambda x: x[1])[0] + print("Part 1: ", int(guard_id) * minute) + + # Of all guards, which guard is most frequently asleep on the same minute? + maxs = { m: max(minutes[m].items(), key=lambda x: x[1]) for m in minutes.keys()} + minute, rest = max(maxs.items(), key=lambda x: x[1][1]) + id_, _ = rest + print("Part 2: ", int(id_) * minute) + + +if __name__ == '__main__': + import sys + infile = sys.argv[1] if len(sys.argv) > 1 else "example.txt" + with open(infile) as inp: + main(inp.readlines()) +