Code for the Advent of Code event
aoc advent-of-code
at rust 45 lines 1.2 kB view raw
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}"