Mercurial > repos > other > adventofcode2023
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 |
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 |