annotate day6b.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 6e0615e54e71
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 #! /usr/bin/env ruby
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 if ARGV.length != 1
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 abort("Incorrect arguments - needs input file")
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 elsif not File.exist? (ARGV[0])
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 abort("File #{ARGV[0]} did not exist")
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 end
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 file = ARGV[0]
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 time, distance = File.open(file, "r").each_line(chomp: true).map {|v| v.split(":")[1].split(" ").join("").to_i}
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 events = [[time, distance]]
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 product = events.map do |event|
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 mid = (event[0].to_f / 2).floor
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 first_success = (1..mid).bsearch {|i| (event[0] - i) * i > event[1]}
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 num_success = (mid - first_success + 1) * 2
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 event[0].odd? ? num_success : num_success - 1
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 end.reduce(:*)
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 puts product