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