From e6a76e428fa0f61e2d3517bb9d20b05ccd4ff884 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Mon, 3 Dec 2018 21:50:37 -0800 Subject: [PATCH] Add day 4 solution. --- day4.cr | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 day4.cr diff --git a/day4.cr b/day4.cr new file mode 100644 index 0000000..df415f6 --- /dev/null +++ b/day4.cr @@ -0,0 +1,52 @@ +require "./common.cr" + +lines = File.read("day4_input").split("\n") +lines.pop +lines.sort! + +REGEX = /\[(\d+)-(\d+)-(\d+) (\d+):(\d+)\].+/ +GUARD_REGEX = /.+#(\d+).+/ + +active = 0 +last_time = {0, 1, 0, 0, 0} +minutes = {} of Int32 => Array(Int32) + +lines.each do |line| + match = line.match(REGEX).not_nil! + year = match[1].to_i32 + month = match[2].to_i32 + day = match[3].to_i32 + hour = match[4].to_i32 + minute = match[5].to_i32 + new_time = {year, month, day, hour, minute} + + if line.includes? "Guard" + active = line.match(GUARD_REGEX).not_nil![1].to_i32 + elsif line.includes? "wakes" + old_year, old_month, old_day, old_hour, old_minute = last_time + difference = (day - old_day) * 24 * 60 + + (hour - old_hour) * 60 + + (minute - old_minute) + + array = minutes[active]? || Array.new(60, 0) + 60.times do |m| + array[m] += difference / 60 + end + (difference % 60).times do |m| + actual_minute = (old_minute + m) % 60 + array[actual_minute] += 1 + end + minutes[active] = array + end + last_time = new_time +end + +guard_num, guard_minutes = minutes.max_by &.[1].sum +puts "Guard num: #{guard_num}" +puts "Guard minute: #{(guard_minutes.index guard_minutes.max).not_nil!}" +puts "Answer num: #{guard_num * (guard_minutes.index guard_minutes.max).not_nil!}" + +guard_num, guard_minutes = minutes.max_by &.[1].max +puts "Guard num: #{guard_num}" +puts "Guard minute: #{(guard_minutes.index guard_minutes.max).not_nil!}" +puts "Answer num: #{guard_num * (guard_minutes.index guard_minutes.max).not_nil!}"