annotate day5.txt @ 18:ddb69833346c

Implement day 11 distance finding in space "shortest distance" is simplified by it being cardinal directions, so it's the same as taking the right-angle between them. The Part 1 space expansion was quite clean, but the Part 2 approach generalises it to something even nicer.
author IBBoard <dev@ibboard.co.uk>
date Mon, 11 Dec 2023 20:08:47 +0000
parents a14f6eca67db
children 1e16a25a9553
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 --- Day 5: If You Give A Seed A Fertilizer ---
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 You take the boat and find the gardener right where you were told he would be: managing a giant "garden" that looks more to you like a farm.
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 "A water source? Island Island is the water source!" You point out that Snow Island isn't receiving any water.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 "Oh, we had to stop the water because we ran out of sand to filter it with! Can't make snow with dirty water. Don't worry, I'm sure we'll get more sand soon; we only turned off the water a few days... weeks... oh no." His face sinks into a look of horrified realization.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 "I've been so busy making sure everyone here has food that I completely forgot to check why we stopped getting more sand! There's a ferry leaving soon that is headed over in that direction - it's much faster than your boat. Could you please go check it out?"
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 You barely have time to agree to this request when he brings up another. "While you wait for the ferry, maybe you can help us with our food production problem. The latest Island Island Almanac just arrived and we're having trouble making sense of it."
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 The almanac (your puzzle input) lists all of the seeds that need to be planted. It also lists what type of soil to use with each kind of seed, what type of fertilizer to use with each kind of soil, what type of water to use with each kind of fertilizer, and so on. Every type of seed, soil, fertilizer and so on is identified with a number, but numbers are reused by each category - that is, soil 123 and fertilizer 123 aren't necessarily related to each other.
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 For example:
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: 79 14 55 13
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 seed-to-soil map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 50 98 2
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 52 50 48
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 soil-to-fertilizer map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 0 15 37
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 37 52 2
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 39 0 15
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 fertilizer-to-water map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 49 53 8
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 0 11 42
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 42 0 7
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 57 7 4
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 water-to-light map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 88 18 7
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 18 25 70
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 light-to-temperature map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 45 77 23
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40 81 45 19
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 68 64 13
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 temperature-to-humidity map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 0 69 1
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 1 0 69
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 humidity-to-location map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 60 56 37
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 56 93 4
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 The almanac starts by listing which seeds need to be planted: seeds 79, 14, 55, and 13.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 The rest of the almanac contains a list of maps which describe how to convert numbers from a source category into numbers in a destination category. That is, the section that starts with seed-to-soil map: describes how to convert a seed number (the source) to a soil number (the destination). This lets the gardener and his team know which soil to use with which seeds, which water to use with which fertilizer, and so on.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55 Rather than list every source number and its corresponding destination number one by one, the maps describe entire ranges of numbers that can be converted. Each line within a map contains three numbers: the destination range start, the source range start, and the range length.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57 Consider again the example seed-to-soil map:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 50 98 2
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60 52 50 48
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
61
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
62 The first line has a destination range start of 50, a source range start of 98, and a range length of 2. This line means that the source range starts at 98 and contains two values: 98 and 99. The destination range is the same length, but it starts at 50, so its two values are 50 and 51. With this information, you know that seed number 98 corresponds to soil number 50 and that seed number 99 corresponds to soil number 51.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
63
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
64 The second line means that the source range starts at 50 and contains 48 values: 50, 51, ..., 96, 97. This corresponds to a destination range starting at 52 and also containing 48 values: 52, 53, ..., 98, 99. So, seed number 53 corresponds to soil number 55.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
65
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
66 Any source numbers that aren't mapped correspond to the same destination number. So, seed number 10 corresponds to soil number 10.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
67
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
68 So, the entire list of seed numbers and their corresponding soil numbers looks like this:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
69
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
70 seed soil
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
71 0 0
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
72 1 1
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
73 ... ...
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
74 48 48
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
75 49 49
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
76 50 52
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
77 51 53
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
78 ... ...
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
79 96 98
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
80 97 99
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
81 98 50
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
82 99 51
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
83
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
84 With this map, you can look up the soil number required for each initial seed number:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
85
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
86 Seed number 79 corresponds to soil number 81.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
87 Seed number 14 corresponds to soil number 14.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
88 Seed number 55 corresponds to soil number 57.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
89 Seed number 13 corresponds to soil number 13.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
90
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
91 The gardener and his team want to get started as soon as possible, so they'd like to know the closest location that needs a seed. Using these maps, find the lowest location number that corresponds to any of the initial seeds. To do this, you'll need to convert each seed number through other categories until you can find its corresponding location number. In this example, the corresponding types are:
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
92
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
93 Seed 79, soil 81, fertilizer 81, water 81, light 74, temperature 78, humidity 78, location 82.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
94 Seed 14, soil 14, fertilizer 53, water 49, light 42, temperature 42, humidity 43, location 43.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
95 Seed 55, soil 57, fertilizer 57, water 53, light 46, temperature 82, humidity 82, location 86.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
96 Seed 13, soil 13, fertilizer 52, water 41, light 34, temperature 34, humidity 35, location 35.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
97
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
98 So, the lowest location number in this example is 35.
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
99
cd5a8f086973 Implement part 1 plant mapping and lookup
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
100 What is the lowest location number that corresponds to any of the initial seed numbers?
5
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
101
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
102
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
103 --- Part Two ---
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
104
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
105 Everyone will starve if you only plant such a small number of seeds. Re-reading the almanac, it looks like the seeds: line actually describes ranges of seed numbers.
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
106
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
107 The values on the initial seeds: line come in pairs. Within each pair, the first value is the start of the range and the second value is the length of the range. So, in the first line of the example above:
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
108
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
109 seeds: 79 14 55 13
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
110
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
111 This line describes two ranges of seed numbers to be planted in the garden. The first range starts with seed number 79 and contains 14 values: 79, 80, ..., 91, 92. The second range starts with seed number 55 and contains 13 values: 55, 56, ..., 66, 67.
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
112
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
113 Now, rather than considering four seed numbers, you need to consider a total of 27 seed numbers.
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
114
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
115 In the above example, the lowest location number can be obtained from seed number 82, which corresponds to soil 84, fertilizer 84, water 84, light 77, temperature 45, humidity 46, and location 46. So, the lowest location number is 46.
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
116
a14f6eca67db Record day5 part 2 instructions
IBBoard <dev@ibboard.co.uk>
parents: 4
diff changeset
117 Consider all of the initial seed numbers listed in the ranges on the first line of the almanac. What is the lowest location number that corresponds to any of the initial seed numbers?