Like a GIF For Your Yard

rmion

Robert Mion

Posted on September 12, 2022

Like a GIF For Your Yard

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

  1. The origin of this puzzle theme?
  2. 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(''))
Enter fullscreen mode Exit fullscreen mode

Relative coordinates of all eight adjacent cells:

adjacents = [
  [-1,-1],
  [-1, 0],
  [-1, 1],
  [ 0,-1],
  [ 0, 1],
  [ 1,-1],
  [ 1, 0],
  [ 1, 1]
]
Enter fullscreen mode Exit fullscreen mode

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
  }
}
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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, "#"])
}
Enter fullscreen mode Exit fullscreen mode

Return the count of lights that are on:

return [
  ...grid.map(
    el => el.join('')
  ).join('\n')
  .matchAll(/#/g)
].length
Enter fullscreen mode Exit fullscreen mode

It generated the correct answer for my puzzle input!

Part 2

  1. Another disappointment
  2. 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]]
Enter fullscreen mode Exit fullscreen mode

Ensuring each one is left on at the end of each iteration:

corners.forEach(coord => {
  grid[coord[0]][coord[1]] = "#"
})
Enter fullscreen mode Exit fullscreen mode

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!
💖 💪 🙅 🚩
rmion
Robert Mion

Posted on September 12, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Cube Conundrum
adventofcode Cube Conundrum

December 2, 2023

Haunted Wasteland
adventofcode Haunted Wasteland

December 18, 2023

The Ideal Stocking Stuffer
adventofcode The Ideal Stocking Stuffer

September 22, 2022

Knights of the Dinner Table
adventofcode Knights of the Dinner Table

September 18, 2022

Like a GIF For Your Yard
adventofcode Like a GIF For Your Yard

September 12, 2022