Add day 4 solution.
This commit is contained in:
parent
735170ea73
commit
e6a76e428f
52
day4.cr
Normal file
52
day4.cr
Normal file
|
@ -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!}"
|
Loading…
Reference in New Issue
Block a user