annotate day6.rb @ 33:676461cc3a70

Day 23 - track segments, not each space This allows us to explore the branches once then do quicker calculations for valid route lengths. But still requires exploring 1,262,816 routes to find the longest!
author IBBoard <dev@ibboard.co.uk>
date Thu, 04 Jan 2024 14:52:24 +0000
parents 51e5f26dc81e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 #! /usr/bin/env ruby
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 if ARGV.length != 1
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 abort("Incorrect arguments - needs input file")
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 elsif not File.exist? (ARGV[0])
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 abort("File #{ARGV[0]} did not exist")
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 end
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 file = ARGV[0]
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
8
51e5f26dc81e Add a template file for reuse
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
11 times, distances = File.open(file, "r").each_line(chomp: true).map {|v| puts v; puts v.split(":"); v.split(":")[1].split(" ").map(&:to_i)}
6
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 events = times.zip(distances)
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 product = events.map do |event|
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 mid = (event[0].to_f / 2).floor
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 first_success = (1..mid).bsearch {|i| (event[0] - i) * i > event[1]}
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 num_success = (mid - first_success + 1) * 2
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 event[0].odd? ? num_success : num_success - 1
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 end.reduce(:*)
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 puts product