## Advent of Code 2022 Day 18

## Part 1

- Third in a row. Grrr!
- Trying again: using arrays to represent a 3D grid
- Scrap that: use Manhattan Distance instead?
- My algorithm in JavaScript

### Third in a row. Grrr!

- First was Day 16: a search algorithm
- Second was Day 17: a puzzle that seemed approachable but wound up being a complex state management task that I wasn't able to crack
- Third is today: another 3D puzzle demanding I identify touching sides

It's no surprise: usually Days 16+ are 0- and 1-star days for me.

I just get mad when I don't even have a working strategy to solve Part 1.

### Trying again: using arrays to represent a 3D grid

I've tried before.

But I don't think I was successful.

So, might as well try again.

1D grid - columns:

- An array
- Each item is a column

```
[ ..., ..., ..., ..., ... ]
```

2D grid - rows and columns:

- Arrays inside an array
- Each item is a row
- Each item in there is a column

```
[
[ ..., ..., ... ],
[ ..., ..., ... ],
[ ..., ..., ... ]
]
```

3D grid - planes with rows and columns:

- Arrays inside arrays inside an array
- Each item is a plane
- Each item inside is a row
- Each item in there is a column

```
[
[
[ ..., ..., ... ],
[ ..., ..., ... ],
[ ..., ..., ... ]
]
]
```

### Scrap that: use Manhattan Distance instead?

What if I:

- Compared a single cube to all other cubes
- Tallied a count of any that are a Manhattan Distance of 1 away
- Accumulated an amount that is 6 minus that tally for each cube

#### The small example

The cubes:

```
1,1,1
2,1,1
```

Compare the first and second cubes:

```
X Y Z
1,1,1
2,1,1
MD
1 0 0 = 1
Adjacent!
6 - 1 = 5
```

Compare the second and first cubes:

```
X Y Z
2,1,1
1,1,1
MD
1 0 0 = 1
Adjacent!
6 - 1 = 5
```

Accumulate the totals:

```
5 + 5 = 10
```

#### The larger example

The cubes:

```
2,2,2
1,2,2
3,2,2
2,1,2
2,3,2
2,2,1
2,2,3
2,2,4
2,2,6
1,2,5
3,2,5
2,1,5
2,3,5
```

Using Manhattan Distance from all other cubes to find the count of each cube:

```
2,2,2 IIIIII
1,2,2 I
3,2,2 I
2,1,2 I
2,3,2 I
2,2,1 I
2,2,3 II
2,2,4 I
2,2,6
1,2,5
3,2,5
2,1,5
2,3,5
```

Accumulating the totals:

```
2,2,2 IIIIII -> 6 - 6 = 0
1,2,2 I -> 6 - 1 = 5
3,2,2 I -> 6 - 1 = 5
2,1,2 I -> 6 - 1 = 5
2,3,2 I -> 6 - 1 = 5
2,2,1 I -> 6 - 1 = 5
2,2,3 II -> 6 - 2 = 4
2,2,4 I -> 6 - 1 = 5
2,2,6 -> 6 - 0 = 6
1,2,5 -> 6 - 0 = 6
3,2,5 -> 6 - 0 = 6
2,1,5 -> 6 - 0 = 6
2,3,5 -> 6 - 0 = 6
---------------------------
64
```

That's the correct answer!

I may have a winning algorithm here!

### My algorithm in JavaScript

```
return cubes
.reduce((total, cube, index) => {
let adjacent = 0
for (let i = 0; i < cubes.length; i++) {
if (index !== i) {
adjacent += cube
.map(
(side, axis) => Math.abs(side - cubes[i][axis])
)
.reduce(
(sum, count) => sum + count
) == 1 ? 1 : 0
}
}
return total += 6 - adjacent
}, 0)
```

Running it on:

- The small example generated the correct answer!
- The larger example generated the correct answer!
- My puzzle input (nearly 8 million comparisons!) generated the correct answer...after a few seconds!

## Part 2

### Does not compute

I'm confused about what it wants me to find.

The cube identified in the larger example makes me even more confused.

I can't attempt to solve a puzzle if I am confused by what it wants me to find.

## I did it!

- I solved Part 1!
- Using Manhattan Distance and a boat-load of comparisons!
- I was able to avoid the nightmare of nested arrays to simulate 3D!

Exiting a 3D puzzle at Day 18 with one gold star earned?

That puts a smile on my face, especially after the lack of stars in the past couple of days.

## Top comments (0)