Code for the Advent of Code event
aoc
advent-of-code
1#!/usr/bin/env ruby
2# frozen_string_literal: true
3
4require 'date'
5
6guards = Hash.new { |h, k| h[k] = Hash.new(0) }
7id = 0
8awake = true
9lastminute = 0
10
11entries = File.readlines('input.txt').map do |line|
12 time, data = line.split '] '
13 [DateTime.parse(time[1..]), data]
14end.sort_by(&:first)
15
16entries.each do |array|
17 minute = array.first.minute
18
19 case array.last
20 when /^Guard \#(\d+) begins shift$/
21 (lastminute...60).each { |m| guards[id][m] += 1 } if id != 0 && !awake && lastminute < 60
22
23 id = $1.to_i
24 lastminute = 0
25 awake = true
26 when /^falls asleep$/
27 guards[id][minute] += 1
28 awake = false
29 lastminute = minute + 1
30 when /^wakes up$/
31 (lastminute...minute).each { |m| guards[id][m] += 1 } unless awake
32 awake = true
33 lastminute = minute + 1
34 end
35end
36
37result_id = 0
38result_minute = guards.min { |a, b| b.last.values.sum <=> a.last.values.sum }.tap { |a|
39 result_id = a.first
40}.last.min { |a, b| b.last <=> a.last }.first
41
42puts "Part 1: #{result_id * result_minute}"
43
44p2_guard = guards.min { |a, b| b.last.values.max <=> a.last.values.max }
45puts "Part 2: #{p2_guard.first * p2_guard.last.min { |a, b| b.last <=> a.last }.first}"