Advent of Code 2015 Day 18
Striving for 4/4 stars
- I skipped today's puzzle to complete Day 6
- Thankfully, Day 6 was relatively easy, and I earned two stars
- I hope I can earn two stars today, too
- Let's do it!
Part 1
- The origin of this puzzle theme?
- Writing a working algorithm
The origin of this puzzle theme?
- In years past, this puzzle theme occurred around the same time: Days 15-25
- This puzzle's instructions feel comprehensive and introductory
- Making me think that today's puzzle was the first of its kind in this first year of puzzles
- I'm just glad it's not the first time I'm encountering it
- To the contrary, it seems very doable given all my previous successful encounters
Writing a working algorithm
Parsing the input into a grid of nested arrays:
input.split('\n')
.map(line => line.split(''))
Relative coordinates of all eight adjacent cells:
adjacents = [
[-1,-1],
[-1, 0],
[-1, 1],
[ 0,-1],
[ 0, 1],
[ 1,-1],
[ 1, 0],
[ 1, 1]
]
Iterate through each of the 10,000 cells in the grid:
for (let row = 0; row < grid.length; row++) {
for (let col = 0; col < grid[row].length; col++) {
// access each cell
}
}
Count on
and off
lights in adjacent cells:
let neighbors_on = adjacents.map(coord =>
grid[row + coord[0]] == undefined ||
grid[row + coord[0]][col + coord[1]] == undefined
? 0 : grid[row + coord[0]][col + coord[1]] == '#'
? 1 : 0
).reduce((lights_on, current) => lights_on + current)
Queue up each light that must change:
let changers = []
if (grid[row][col] == "#" && ![2,3].includes(neighbors_on)) {
changers.push([row, col, "."])
} else if (grid[row][col] == "." && neighbors_on == 3) {
changers.push([row, col, "#"])
}
Return the count of lights that are on
:
return [
...grid.map(
el => el.join('')
).join('\n')
.matchAll(/#/g)
].length
It generated the correct answer for my puzzle input!
Part 2
- Another disappointment
- One more loop in each iteration
Another disappointment
- Much like with Day 6, I was hoping there would be a message or picture revealed after a certain number of light-changing rounds
- Instead, just a simple change to the rules and another count after the same number of iterations
One more loop in each iteration
The list of four corner coordinates:
let corners = [[0,0],[99,0],[99,99],[0,99]]
Ensuring each one is left on at the end of each iteration:
corners.forEach(coord => {
grid[coord[0]][coord[1]] = "#"
})
It generated the correct answer for my puzzle input!
I did it!!!!
- I solve both parts!
- Thus, I earned all four stars from each part of both days!
- I wrote yet another adjacent-cell checking, queuing and changing algorithm!
- I built a simulator to re-create the light show!
Top comments (0)