Mercurial > repos > other > adventofcode2023
annotate day5.rb @ 27:6b58ddfaed38
Add Day 18 part 1 solution using line crossing
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Tue, 02 Jan 2024 16:04:33 +0000 |
parents | cd5a8f086973 |
children |
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() |