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
• 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)
)
``````

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])
``````

Control flow based on the type of instruction:

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

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]
}
}
``````

Counting all the lights that are on:

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

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

``````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!