AoC Day 21, Part 1 Solved
This commit is contained in:
100
2023/21/README.md
Executable file
100
2023/21/README.md
Executable file
@@ -0,0 +1,100 @@
|
|||||||
|
## \-\-\- Day 21: Step Counter ---
|
||||||
|
|
||||||
|
You manage to catch the [airship](7) right as it's dropping someone else off on their all-expenses-paid trip to Desert Island! It even helpfully drops you off near the [gardener](5) and his massive farm.
|
||||||
|
|
||||||
|
"You got the sand flowing again! Great work! Now we just need to wait until we have enough sand to filter the water for Snow Island and we'll have snow again in no time."
|
||||||
|
|
||||||
|
While you wait, one of the Elves that works with the gardener heard how good you are at solving problems and would like your help. He needs to get his [steps](https://en.wikipedia.org/wiki/Pedometer) in for the day, and so he'd like to know _which garden plots he can reach with exactly his remaining `64` steps_.
|
||||||
|
|
||||||
|
He gives you an up-to-date map (your puzzle input) of his starting position ( `S`), garden plots ( `.`), and rocks ( `#`). For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
...........
|
||||||
|
.....###.#.
|
||||||
|
.###.##..#.
|
||||||
|
..#.#...#..
|
||||||
|
....#.#....
|
||||||
|
.##..S####.
|
||||||
|
.##..#...#.
|
||||||
|
.......##..
|
||||||
|
.##.#.####.
|
||||||
|
.##..##.##.
|
||||||
|
...........
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
The Elf starts at the starting position ( `S`) which also counts as a garden plot. Then, he can take one step north, south, east, or west, but only onto tiles that are garden plots. This would allow him to reach any of the tiles marked `O`:
|
||||||
|
|
||||||
|
```
|
||||||
|
...........
|
||||||
|
.....###.#.
|
||||||
|
.###.##..#.
|
||||||
|
..#.#...#..
|
||||||
|
....#O#....
|
||||||
|
.##.OS####.
|
||||||
|
.##..#...#.
|
||||||
|
.......##..
|
||||||
|
.##.#.####.
|
||||||
|
.##..##.##.
|
||||||
|
...........
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, he takes a second step. Since at this point he could be at _either_ tile marked `O`, his second step would allow him to reach any garden plot that is one step north, south, east, or west of _any_ tile that he could have reached after the first step:
|
||||||
|
|
||||||
|
```
|
||||||
|
...........
|
||||||
|
.....###.#.
|
||||||
|
.###.##..#.
|
||||||
|
..#.#O..#..
|
||||||
|
....#.#....
|
||||||
|
.##O.O####.
|
||||||
|
.##.O#...#.
|
||||||
|
.......##..
|
||||||
|
.##.#.####.
|
||||||
|
.##..##.##.
|
||||||
|
...........
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
After two steps, he could be at any of the tiles marked `O` above, including the starting position (either by going north-then-south or by going west-then-east).
|
||||||
|
|
||||||
|
A single third step leads to even more possibilities:
|
||||||
|
|
||||||
|
```
|
||||||
|
...........
|
||||||
|
.....###.#.
|
||||||
|
.###.##..#.
|
||||||
|
..#.#.O.#..
|
||||||
|
...O#O#....
|
||||||
|
.##.OS####.
|
||||||
|
.##O.#...#.
|
||||||
|
....O..##..
|
||||||
|
.##.#.####.
|
||||||
|
.##..##.##.
|
||||||
|
...........
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
He will continue like this until his steps for the day have been exhausted. After a total of `6` steps, he could reach any of the garden plots marked `O`:
|
||||||
|
|
||||||
|
```
|
||||||
|
...........
|
||||||
|
.....###.#.
|
||||||
|
.###.##.O#.
|
||||||
|
.O#O#O.O#..
|
||||||
|
O.O.#.#.O..
|
||||||
|
.##O.O####.
|
||||||
|
.##.O#O..#.
|
||||||
|
.O.O.O.##..
|
||||||
|
.##.#.####.
|
||||||
|
.##O.##.##.
|
||||||
|
...........
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, if the Elf's goal was to get exactly `6` more steps today, he could use them to reach any of `16` garden plots.
|
||||||
|
|
||||||
|
However, the Elf _actually needs to get `64` steps today_, and the map he's handed you is much larger than the example map.
|
||||||
|
|
||||||
|
Starting from the garden plot marked `S` on your map, _how many garden plots could the Elf reach in exactly `64` steps?_
|
||||||
89
2023/21/code.go
Normal file
89
2023/21/code.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/jpillora/puzzler/harness/aoc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
aoc.Harness(run)
|
||||||
|
}
|
||||||
|
|
||||||
|
// on code change, run will be executed 4 times:
|
||||||
|
// 1. with: false (part1), and example input
|
||||||
|
// 2. with: true (part2), and example input
|
||||||
|
// 3. with: false (part1), and user input
|
||||||
|
// 4. with: true (part2), and user input
|
||||||
|
// the return value of each run is printed to stdout
|
||||||
|
func run(part2 bool, input string) any {
|
||||||
|
grid := make([][]rune, 0)
|
||||||
|
v, h := 0, 0
|
||||||
|
for y, l := range strings.Split(input, "\n") {
|
||||||
|
if l == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
gridLine := make([]rune, 0)
|
||||||
|
for x, s := range strings.Split(l, "") {
|
||||||
|
if s == "S" {
|
||||||
|
v, h = y, x
|
||||||
|
}
|
||||||
|
gridLine = append(gridLine, rune(s[0]))
|
||||||
|
}
|
||||||
|
grid = append(grid, gridLine)
|
||||||
|
}
|
||||||
|
|
||||||
|
steps := 64
|
||||||
|
|
||||||
|
// when you're ready to do part 2, remove this "not implemented" block
|
||||||
|
if part2 {
|
||||||
|
return "not implemented"
|
||||||
|
}
|
||||||
|
// solve part 1 here
|
||||||
|
|
||||||
|
possibleCells := [][]int{{v, h}}
|
||||||
|
|
||||||
|
for i := 0; i < steps; i++ {
|
||||||
|
nextStepCells := make([][]int, 0)
|
||||||
|
alreadyStepped := make(map[string]bool)
|
||||||
|
|
||||||
|
for _, pc := range possibleCells {
|
||||||
|
|
||||||
|
if pc[0] > 0 && grid[pc[0]-1][pc[1]] != '#' {
|
||||||
|
if _, ok := alreadyStepped[fmt.Sprintf("%v;%v", pc[0]-1, pc[1])]; !ok {
|
||||||
|
nextStepCells = append(nextStepCells, []int{pc[0] - 1, pc[1]})
|
||||||
|
alreadyStepped[fmt.Sprintf("%v;%v", pc[0]-1, pc[1])] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pc[1] > 0 && grid[pc[0]][pc[1]-1] != '#' {
|
||||||
|
if _, ok := alreadyStepped[fmt.Sprintf("%v;%v", pc[0], pc[1]-1)]; !ok {
|
||||||
|
nextStepCells = append(nextStepCells, []int{pc[0], pc[1] - 1})
|
||||||
|
alreadyStepped[fmt.Sprintf("%v;%v", pc[0], pc[1]-1)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pc[0] < len(grid)-1 && grid[pc[0]+1][pc[1]] != '#' {
|
||||||
|
if _, ok := alreadyStepped[fmt.Sprintf("%v;%v", pc[0]+1, pc[1])]; !ok {
|
||||||
|
nextStepCells = append(nextStepCells, []int{pc[0] + 1, pc[1]})
|
||||||
|
alreadyStepped[fmt.Sprintf("%v;%v", pc[0]+1, pc[1])] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pc[1] < len(grid[0])-1 && grid[pc[0]][pc[1]+1] != '#' {
|
||||||
|
if _, ok := alreadyStepped[fmt.Sprintf("%v;%v", pc[0], pc[1]+1)]; !ok {
|
||||||
|
nextStepCells = append(nextStepCells, []int{pc[0], pc[1] + 1})
|
||||||
|
alreadyStepped[fmt.Sprintf("%v;%v", pc[0], pc[1]+1)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
possibleCells = nextStepCells
|
||||||
|
//fmt.Printf("Possible steps: %v\n", possibleCells)
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(possibleCells)
|
||||||
|
}
|
||||||
11
2023/21/input-example.txt
Executable file
11
2023/21/input-example.txt
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
...........
|
||||||
|
.....###.#.
|
||||||
|
.###.##..#.
|
||||||
|
..#.#...#..
|
||||||
|
....#.#....
|
||||||
|
.##..S####.
|
||||||
|
.##..#...#.
|
||||||
|
.......##..
|
||||||
|
.##.#.####.
|
||||||
|
.##..##.##.
|
||||||
|
...........
|
||||||
131
2023/21/input-user.txt
Normal file
131
2023/21/input-user.txt
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
...................................................................................................................................
|
||||||
|
..#.......#.#.##...........#...#..................#......................#.......#.......#............#...............#.....#...#..
|
||||||
|
................#....#.#.....#.#..#.#..#.........#.....................#......................#......#....#..........#.............
|
||||||
|
..#.##.....................#......##..#...##.#............................#.....#..............#..................#..#......#......
|
||||||
|
.....#.#.....#...#........#............#.#.#..#.#...#.........................................##......#..........#.#..##...........
|
||||||
|
.....#....##.........#.......##............##....#.............................#.........#.....#....#.#....#...........#.##........
|
||||||
|
...........#..#...#...........#.....##................#.........#..#...................#.#..#.....#................................
|
||||||
|
..#.....#....#....#....#......#.#.............................................###.#.......#....#..........#.#....#.....#...........
|
||||||
|
....#........................#............#.......#...............#..#.......#..........#.........#....#......#..##.........#......
|
||||||
|
..........#...#..........#..#............##.........#...........#...............................#.........#........#........#......
|
||||||
|
....#............#.#...........#.............#..#..............................##.#....#...#.#.#.#.#........#......#..#............
|
||||||
|
....#..#...#.#....#.#.##..#...................##..#........#.##....................#............#......#........#...#..............
|
||||||
|
......#.....#...##...#...#......##.....#.....#.#...............#....................#.#......#.............#..........#.........#..
|
||||||
|
......#....#..#...........##...#.#.#.#.#......##...........#.......#.....##.............#.#..##...##....................#.......#..
|
||||||
|
......................................#.#......#.......#....#...#.#..#...#............#..#........####......#....##................
|
||||||
|
..#........#........#.............#....................#.......#....#.....#................#...................#..........#........
|
||||||
|
..................#.....#.#.#....#......#.....................#............#...............#..#......#...#..##......#............#.
|
||||||
|
...#........#....#......#............................#.......#....#........#.#............................#..#....#......##........
|
||||||
|
..#..........#...#..................#......................#......#........#.............#....#..##.#......##......##.#............
|
||||||
|
...........#..........#......#..#...#.#...........#.......#.....#.....#..#...............#..............#...#.....#.##.......#.....
|
||||||
|
.#......#..#....#..................................................#..#......#.........................#.......#.....#.....#.....#.
|
||||||
|
.....##..................#............................#...#........#..#....#.#..............#.....................##.......#..##...
|
||||||
|
.........#...#......#.....###..........#...............#.......#..................................#.........##....#.......#........
|
||||||
|
....#........#.................#..............#.#......#...##...#....#...#.....#...................#....#...#.....#....#.#.........
|
||||||
|
.....#....##....#.............#...#..........................#..................#.................#..........#..............##...#.
|
||||||
|
....#.#..#....#.................#............................#......#.#................................#..##......##.....#.........
|
||||||
|
......#.................#........#.........#......##....#...#.#........#...#.....#.....................##........#..#..#...........
|
||||||
|
..........#.#.......#......#.....#..................##.......#........#.....##....#.............#.................#.#..#...........
|
||||||
|
.#.#....##.#.#.......#...................##....#...#..........#.........#.#..##.#.......#........#....#....#.#..........##....#....
|
||||||
|
...............#......#...#..............###......#.............#....#...##........#.................#....#.................##.#...
|
||||||
|
.......#....#.......#.....##.#................#...........#....................#.....##...##.........#....................##....#..
|
||||||
|
.................#.....#........................#........#.....#........#...#......#................#............................#.
|
||||||
|
..........#.................#........#..#.....................#...........##.#..............#..................#.................#.
|
||||||
|
.#.#.#................................#...#.#...#.........#...#.....#...........#..........#.#........#.#.#..........#.....#.......
|
||||||
|
.#..#...#..#...............#.................#...##...#........#........#....####......#....#.............#..#...#.............#.#.
|
||||||
|
............##........#...............#.#......................#...#..#...##..##..........#...#.........#..........##.......#......
|
||||||
|
.........#.#.#...#......#.....................##...............#..#.###........#............#..#......................#......##....
|
||||||
|
.#........##.......#.............#.#..........#..#........#..#.#.................................#..................#......#.#.....
|
||||||
|
..##...#....#..........................#...#.#.#.........#..#............#.......#....#..............................#....#........
|
||||||
|
......#.....##....#...................#...................#........#...#....#...........#..#.....#.................#.#..#.......##.
|
||||||
|
....##...#......................#.##..#....#...#.....#..................#..#...........#.....#................#...##...........##..
|
||||||
|
...............##...............#.................#.......##..........................#...#.#.........#........#........#......#...
|
||||||
|
.##....#....#...#...........#.....##....#..............#...#.........#...#.....##.....#........##.#.#...................#.......#..
|
||||||
|
.#............................#.....#...#....#.#.....#.....#.###.............#...............................................#..#..
|
||||||
|
..........#..................#...#......#...............#.#.......#............#..........#....#.................#....#.......#....
|
||||||
|
.#..#....#...#....................#......#........#.......#...#.#........#.#..........#.............#..##...........#..#...........
|
||||||
|
....#......#..................#.......#.......###..#.#.#...........#.#............#................#.....#...........##..#.##..#...
|
||||||
|
.......#.#.#...................#.##...........#.........#...#............#.....##....#..........#.....#.#.............#.#...#......
|
||||||
|
............#........##....#...........#.............................#.#.#....#..#......#.................#..........#......#.#....
|
||||||
|
.....##.#.........................#.#...##.#..#....#..........#..........#............#.......#..##.....##.##..............#.......
|
||||||
|
..#..#......................................#.......#.#..#.#.........#.....#...............#.....................................#.
|
||||||
|
......#........................#.......#.#............................#..#..#.......#......#.....#............#.#................#.
|
||||||
|
...###.#.........#..##......#............#.............###......#....#....##...................##...#..#.#....#.............#.#.#..
|
||||||
|
..##....#...........#.............#..#..#.#..........#..............#...#........#..##..#.........................#.......#........
|
||||||
|
.#.....#.............##.....#.....###.#.#..#.......#......#..#........#..............#.#....#.....................#...........#....
|
||||||
|
....#.........................#....##......#..#......#.#.....#.#.....#.................#.................#.........#...............
|
||||||
|
.#............#.........#........#.#.#.....#.....#...#.....#......#......#...............#.#.........#.............................
|
||||||
|
................##...#...#......#....#....#.........##.............#.......#.....#.......................#..###..#...##............
|
||||||
|
...........#.#..............#..#.......#....#.#.....#..............................#..##....................#.#......#.............
|
||||||
|
..................#....................#............................##.#..#.#..........#..................#............#...........
|
||||||
|
.............#.....#.......##...#..#........#.................##......#......#.#..............#..........#........#.#.#............
|
||||||
|
...........................#....##...#.###...........#.#..........#.............#.....#.#....#.....#....#..........#...............
|
||||||
|
.............#........##........#.#.#..##....#......#.............#.#....#.#.#...#...#....#.#..#.......#...........##..#...........
|
||||||
|
......#..#.....#........##.....#......#......#.#....#.#..#...#.........#.........#..............#..........###.....................
|
||||||
|
.............#..........#..#...####..........#......#..#....#.........#..##............##.....#..#.....##.#......#.#....#..#.#.....
|
||||||
|
.................................................................S.................................................................
|
||||||
|
.....................#.....#.#........##......#......##..#..#.......#.##..#...........................#..#.........................
|
||||||
|
......................#.#..........##....................#.................#......#..#.....................##.....#.......#........
|
||||||
|
................#..........#...#.....................#....#..........#.##.....##........#......#........##....#..........##........
|
||||||
|
.........##...#.#..#.....#.#...#.#................#.........#.......#..##..#.....#...#...##....#...#............#....##............
|
||||||
|
...........................#..#..#...#..#...##..................................................##.........##.#...#................
|
||||||
|
............#..#.........#........#.......#......#...#......##.##.................#.#........##.#....#....#.#...#....#.............
|
||||||
|
...........#..#.....#..#..#......#.#..#............#............#.........#..#.....#..#........#..............##.......#.......##..
|
||||||
|
...................#....##...........#.#......#.......##..#..#.#.....#...#...#.##..............#.##....#....#.#.....#.........#....
|
||||||
|
..................#..#....#......#.#...........#...#.......#........#...#......#...........#.....................#.#.............#.
|
||||||
|
................#...........#.............#.#.....#.........................##.#....#..#..........#.#...#....#................##.#.
|
||||||
|
......##........#.#......#..........#..........#..........................#...#..........###.#..............................##.....
|
||||||
|
.....#..............#........#.....#.#..#....#........##........#..#......#......#......#..#......#......##...................#....
|
||||||
|
.#................#.....#...........#.#.........#.#.....#.##.............#...........#.#.#....##.#..........#...............#.#..#.
|
||||||
|
..#..#.............#...............#....#..........#..#.....#...#...............##.....#...#............#.#...................#....
|
||||||
|
......#............#.....#.................#..............##.#......##............#....#..#.#..#.#.#.............................#.
|
||||||
|
...#..................##..........#..........#...#.................#.......#.....#...#...................#..................#.#....
|
||||||
|
.#....##....................#...#...#.........#.#....#...#.#.......#..##..#.#....#........##.#....##......#..........#...#....#..#.
|
||||||
|
....#.........#............#..#.....#.#.....#.#..#.....#................#..........#.....##...........................##...........
|
||||||
|
.#............................#...............#...#.#.........#.....#...#..........#...#.......##..#..................##.##....#...
|
||||||
|
.......#..................#.#.............#.......#....#............................#...................#.#........................
|
||||||
|
.........#........................####......#......##...##............#.....#...#...##.......#.....#.............#.##.#............
|
||||||
|
..#..#.##......#..........#..............#............#...................##...................#..#.....#.......#.....#...#...##...
|
||||||
|
....#..#...........................#.........#...#.........#.#.....#.............#.......#............#.................###.#....#.
|
||||||
|
...#.......#.#.......................##....#.......................#............#......#.....#..#....#..........#.......#..........
|
||||||
|
.......#.........##.#................#.........#.#..#.........#.....#.#...............#.#....#....#............#.....#.............
|
||||||
|
..................#.#.......................#................##......#...............#......................#..#.#.#..........##...
|
||||||
|
......##.......#.......#............#.....#........#.....##....#.....#.............#.#....#.....#.............#......#.............
|
||||||
|
...#.........#.....#...............#.........#.....#..........#...#.........#....#.#.......###..#.#..............#.................
|
||||||
|
.........#....##.#...#............#.....................#...........##......#..#..##......#.................#..#.##................
|
||||||
|
.........#.........#...##..............#.#...#..###........#.#......#...#..#............#.......#.............#.....#.......#....#.
|
||||||
|
.....................#...#..........#.#............#...#.#.##..##..........#..#........#.......#........#.......#..#.....#.#.....#.
|
||||||
|
....#..........#....................#...............................#.##.##.......###.........#........#....#.................####.
|
||||||
|
..........#...#.............##..................#..#....#............#...................#..#.............#.......#...#.......#....
|
||||||
|
.#....#..##......#.#.##.....#.............................##.#............#.#..............#.........#.................#......#....
|
||||||
|
..#.........#.....#........#................#...#...................#..............#..#............#...#...#...................#...
|
||||||
|
....#..#..#..#...........#................#......#...#......#.....#........#...#...##.#..............#........#.#......#..#..#.#...
|
||||||
|
......##..#..#..............##...........#.#...#............#...#.#.....#.#.....#.......##...............#.#.......................
|
||||||
|
.......#.........#.........#..............#...#......................#....#....#........#.......#.........#......#.................
|
||||||
|
...#..#.........#...#...#........#...............#............#....###.#.#.........#...............#................#.......#....#.
|
||||||
|
.......#.....#........#..........#...............................................#..#.#...................#.........#..#...........
|
||||||
|
................#..#....#..#......................##...............##...#.##...#..................#.....#.......#..................
|
||||||
|
.#......#...#...............#.........................#...#.............#.....#............................#.................#..#..
|
||||||
|
.................##....##........................#.......#.#...........#......................##.......#.............#...#..#......
|
||||||
|
.#..........#....#................##....#.............#.......#...#...#......#...#.................#....#....................#...#.
|
||||||
|
..................##..#.#.##..#.#...........................#.................##..........#.....................#..........#....#..
|
||||||
|
....................#...#............#..#................#...#.#...........#..#............#......##....#.....##..............#....
|
||||||
|
.#..#......#........#.........#......#..#................#.#...#..#.#......#.............#.#.....#....###...#.#....##..............
|
||||||
|
....#......#.#..#................#.#...#................#...#.......#.#.#..............#......................#..#.....#........#..
|
||||||
|
........#.............#...##.#.#...#......#................#........#...#...............#.#.......#........##.#...#.......#......#.
|
||||||
|
.........................##..#......#.#.....#.........##....#............#..........#.............#......#....#............#...#...
|
||||||
|
...#.....#..#.....#.........#..#..#.##.................................#.............#......##............#....#..#......#.......#.
|
||||||
|
..#...#....#.#.#...#...#..#...#............##.............................#..................##..............#...................#.
|
||||||
|
..#..#.....##.............#...........#...#...#.#..........#.......#....#...........#........#........##.......#.......#...........
|
||||||
|
........#.#...#...........#..###...........#.....#................#.................##.........#.....#....#....#.....#.#.......#.#.
|
||||||
|
...#......#..............#....#...##...#..###.....#.........#.......#....................#...#.........##..........#..#..........#.
|
||||||
|
.....#.#....................#........#....###.#..............####....................................#.#...#..#...........#....#...
|
||||||
|
...#.#...##...#.........#...#............#.....#...#............#...#.........#..#...........................#..#............#.....
|
||||||
|
.#...#.#..###..................#...#..........#......#........#.#................#.......................##.###.....#.#............
|
||||||
|
.....................#.#..#.....#.#..#............................................#..#.......#...#.#.........##.....#..............
|
||||||
|
...#............##.......#...#.##..#........##...#....#....................#.#......#.#....................##.#...#..#....#..#.....
|
||||||
|
........#....#..........................#...#...........................................#...#..............#..........##.......#...
|
||||||
|
..............#..#............##......#..#.#......#....#.........................#.....#..#..#...#..........##.....#..........#....
|
||||||
|
..........#....##........#....#..#....#.................#.................#.#...............#.......#....#...#...............#..#..
|
||||||
|
...............#..#......#..........#...#......#......##.#..............#.#..........#...#......#..#....#................#..#...#..
|
||||||
|
...................................................................................................................................
|
||||||
Reference in New Issue
Block a user