Advent of Code 2020 Day 3
Try the simulator!
Task: Solve for X where...
X = the number of trees hit for each of N trajectories
 N = 1
 N = 5
Example input
..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#
It represents:
 A forrest area
 Where '.'s are open areas and '#'s are trees
Part 1
 Identifying the correct mental model
 Using
modulo
to implement this model  Writing a working algorithm
Identifying the correct mental model
 The instructions indicate that the forrest area expands infinitely to the right
 That is represented one way, like this:
..##.........##.........##.........##.........##.........##.......
#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
.#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
.#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
..#.##.......#.##.......#.##.......#.##.......#.##.......#.##.....
.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
.#........#.#........#.#........#.#........#.#........#.#........#
#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
#...##....##...##....##...##....##...##....##...##....##...##....#
.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#
A path from northwest to southeast would look like this:












But the trick to this challenge is shifting from that mental model, to more of a spiral staircase...or cylindrical model:















Using modulo
to implement this model
 The resulting path for Part 1's trajectory for the example input looks like this:
O.##.......
#..O#...#..
.#....X..#.
..#.#...#O#
.X...##..#.
..#.X#.....
.#.#.#.O..#
.#........X
#.X#...#...
#...#X....#
.#..#...X.#











0
3
6
9
1
4
7
10
2
5
8
 Going from 0 to 3, to 6, to 9 is easy
 But from 9 to 1? How would we do that?
Modulo
calculates the remainder after dividing one value by another.
 The example input has lines with 11 characters
9 % 11 == 9
(9 + 3) % 11 == 12 % 11 == 1
Voila! Using modulo, the line length, the current index and the appropriate offset...gets us the correct horizontal location in each iteration.
Writing a working algorithm
Split the input at each newline character into an array of strings
Split each string into an array of characters
Set variables for row, col and hits...all starting at 0
As long as the location in the processed input at row exists
Increment hits by 1 if the value at the row and column is a #
Increment row by 1
Update col to equal the remainder after dividing the sum of col and 3 by the length of the nested array
Return the value stored in hits
Part 2
 Understanding the scope creep
 Writing an updated working algorithm
 Building the simulator
Understanding the scope creep
 Part 1 featured a single trajectory: (3,1)
 Part 2 features five trajectories
 Therefore, my algorithm must now generate the number of hits for all five trajectories...then calculate the product of all
Writing an updated working algorithm
Split the input at each newline character into an array of strings
Split each string into an array of characters
Set an array with five 2element arrays to represent each trajectory
For each trajectory
Change the 2element array into the number of hits encountered by following these operations:
Set variables for row, col and hits...all starting at 0
As long as the location in the processed input at row exists
Increment hits by 1 if the value at the row and column is a #
Increment row by the value at location 1 from the original 2element array
Update col to equal the remainder after dividing the sum of col and the value at location 2 from the original 2element array by the length of the nested array
Return the product after multiplying each value together
Building the simulator
 I wanted to render the path for each trajectory for any valid input
 When pressing the button corresponding to a trajectory, the forrest area should reset and then progressively render each X and O
Thankfully, I encountered this spirallike algorithm in some puzzles from 2021.
Thus, this puzzle felt especially easy to solve.
Top comments (0)