DEV Community

Cover image for Probably a Fire Hazard
Robert Mion
Robert Mion

Posted on

2

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!

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay