annotate day5.rb @ 26:eb6c3a7d2f72

Constrained and more optimised route finding * Track routes so we can see if we have gone straight for too long * Track multiple routes so we can use a non-optimal route to X if it makes another route to Y through X possible (e.g. optimal route takes three consecutive steps to X, but then has to turn, whereas a longer straight earlier and two consecutive steps to X gives a much better next hop to Y) * We have a start point, so only include the nodes from the search front in "unvisited" to avoid looking at lots of irrelevant nodes
author IBBoard <dev@ibboard.co.uk>
date Sun, 17 Dec 2023 20:13:03 +0000
parents cd5a8f086973
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 #! /usr/bin/env ruby
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 require 'set'
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 if ARGV.length != 1
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 abort("Incorrect arguments - needs input file")
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 elsif not File.exist? (ARGV[0])
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8 abort("File #{ARGV[0]} did not exist")
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 end
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 file = ARGV[0]
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 maps = Hash.new
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 lines = File.open(file, "r").each_line(chomp: true)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 seeds = lines.first.split(":")[1].split(" ").map(&:to_i)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 RawMapping = Struct.new(:from, :to, :ranges)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 MappingRange = Struct.new(:source_range, :offset)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 mappings = Array.new
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 mappings_array = []
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 lines.drop(1).reduce(mappings_array) do |mappings, val|
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 if m = /([a-z]+)-to-([a-z]+) map:/.match(val) then
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 mappings << RawMapping.new(m[1], m[2], [])
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 elsif val != "" then
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 dest_start, source_start, range_length = val.split(" ").map(&:to_i)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 mappings[-1].ranges << MappingRange.new((source_start...(source_start + range_length)), dest_start - source_start)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 end
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 mappings
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 end
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 mappings = mappings_array.map {|mapping| [mapping.from, mapping]}.to_h
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 def map_with_override(mappings, input)
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 mappings.ranges.reduce(input) { |memo, mapping| mapping.source_range.cover?(input) ? input + mapping.offset : memo }
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 end
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 steps = ["seed", "soil", "fertilizer", "water", "light", "temperature", "humidity"]
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43 puts steps.reduce(seeds) {|vals, map_name| vals.map {|v| map_with_override(mappings[map_name], v)}}.min()