Probably a Fire Hazard
Tags: adventofcode, algorithms, programming, javascript
Published: 2022-09-12 01:16:00

## [Advent of Code 2015 Day 6](https://adventofcode.com/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:
```js
let grid = new Array(1000)
  .fill(null)
  .map(
     el => new Array(1000)
      .fill(null)
      .map(el => 0)
  )
```

Within each iteration through the list of instructions, extracting the four corners of each region:
```js
let [minX, minY, maxX, maxY] = [
  ...instruction.matchAll(/\d+/g)
].map(el => +el[0])
```

Control flow based on the type of instruction:
```js
switch (instruction.split(' ')[1]) {
  case 'on':
    // turn on
    break;
  case 'off':
    // turn off
    break;
  default:
    // toggle
}
```

Changing each cell's value:
```js
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]
  }
}
```

Counting all the lights that are on:
```js
return [
  ...grid.map(row => row.join('')).join('').matchAll(/1/g)
].length
```

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:
```js
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
  }
}
```

Counting all the lights that are on:
```js
return grid.reduce(
  (total, row) => total += row.reduce(
    (sum, brightness) => sum + brightness, 0
  ), 0
)
```

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!