DEV Community

Cover image for Like a GIF For Your Yard
Robert Mion
Robert Mion

Posted on

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!

Top comments (0)