DEV Community

Cover image for Probably a Fire Hazard
Robert Mion
Robert Mion

Posted on

Probably a Fire Hazard

Advent of Code 2015 Day 6

Why not Day 18?

  • Day 18 immediately references Day 6
  • Both are light-grid-themed puzzles
  • I'm confident I will earn two stars out of four, and hopeful I can earn all four
  • Let's get to it!

Part 1

  1. Light-grid puzzle? You know what that means!
  2. Double-checking the rules, in case of an unexpected rule variation
  3. The tools I'll use to solve this puzzle
  4. Writing a working algorithm

Light-grid puzzle? You know what that means!

  • Nested arrays of binary values
  • Nested for loops to toggle values
  • An adjacent-cell-checking algorithm
  • A simulator to watch the light show

Double-checking the rules, in case of an unexpected rule variation

Nothing unexpected:

  • 1000 rows, each with 1000 cells containing binary values that start as 0
  • Instructions that indicate whether to make all values within a range 0, 1, or the opposite of the current value
  • A checkpoint to determine whether my algorithm can follow the rules

The tools I'll use to solve this puzzle

Time to write this program, using the following tools:

  • Array methods to determine the type of instruction
  • regex to extract the four coordinates defining each rectangular boundary
  • new Array() to create the 1000x1000 grid
  • nested for loops for each instruction to manipulate the lights

Writing a working algorithm

Generating the 1000x1000 grid:

let grid = new Array(1000)
  .fill(null)
  .map(
     el => new Array(1000)
      .fill(null)
      .map(el => 0)
  )
Enter fullscreen mode Exit fullscreen mode

Within each iteration through the list of instructions, extracting the four corners of each region:

let [minX, minY, maxX, maxY] = [
  ...instruction.matchAll(/\d+/g)
].map(el => +el[0])
Enter fullscreen mode Exit fullscreen mode

Control flow based on the type of instruction:

switch (instruction.split(' ')[1]) {
  case 'on':
    // turn on
    break;
  case 'off':
    // turn off
    break;
  default:
    // toggle
}
Enter fullscreen mode Exit fullscreen mode

Changing each cell's value:

for (let row = minY; row <= maxY; row++) {
  for (let col = minX; col <= maxX; col++) {
    // turn on
    grid[row][col] = 1

    // turn off
    grid[row][col] = 0

    // toggle
    grid[row][col] = 1 - grid[row][col]
  }
}
Enter fullscreen mode Exit fullscreen mode

Counting all the lights that are on:

return [
  ...grid.map(row => row.join('')).join('').matchAll(/1/g)
].length
Enter fullscreen mode Exit fullscreen mode

When run altogether, it generated the correct answer!

Part 2

  1. Feeling a bit disappointed
  2. Updating four lines of code

Feeling a bit disappointed

  • I was hoping the lights would reveal a message or picture
  • Instead, the lights just get slightly more complicated
  • And it's still a counting game

Updating four lines of code

Changing each cell's value:

for (let row = minY; row <= maxY; row++) {
  for (let col = minX; col <= maxX; col++) {
    // turn on
    grid[row][col]++

    // turn off
    grid[row][col] = grid[row][col] == 0 ? 0 : grid[row][col] - 1

    // toggle
    grid[row][col] += 2
  }
}
Enter fullscreen mode Exit fullscreen mode

Counting all the lights that are on:

return grid.reduce(
  (total, row) => total += row.reduce(
    (sum, brightness) => sum + brightness, 0
  ), 0
)
Enter fullscreen mode Exit fullscreen mode

As expected, it generated the correct answer!

I did it!!

  • I solved both parts!
  • I used several algorithmic tools that I've become more familiar with throughout this journey!
  • I opted not to make a simulator, since nothing about the puzzle indicates that seeing the lights reveals anything interesting!

I already know Day 18 is a bit more challenging.

I'm still hopeful I can earn all four stars from these two Days!

Top comments (0)