started day 16 puzzle 1
This commit is contained in:
parent
9a7eef5186
commit
5107cf7f82
15
res/examples/day16_1.txt
Normal file
15
res/examples/day16_1.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
###############
|
||||||
|
#.......#....E#
|
||||||
|
#.#.###.#.###.#
|
||||||
|
#.....#.#...#.#
|
||||||
|
#.###.#####.#.#
|
||||||
|
#.#.#.......#.#
|
||||||
|
#.#.#####.###.#
|
||||||
|
#...........#.#
|
||||||
|
###.#.#####.#.#
|
||||||
|
#...#.....#.#.#
|
||||||
|
#.#.#.###.#.#.#
|
||||||
|
#.....#...#.#.#
|
||||||
|
#.###.#.#.#.#.#
|
||||||
|
#S..#.....#...#
|
||||||
|
###############
|
17
res/examples/day16_2.txt
Normal file
17
res/examples/day16_2.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#################
|
||||||
|
#...#...#...#..E#
|
||||||
|
#.#.#.#.#.#.#.#.#
|
||||||
|
#.#.#.#...#...#.#
|
||||||
|
#.#.#.#.###.#.#.#
|
||||||
|
#...#.#.#.....#.#
|
||||||
|
#.#.#.#.#.#####.#
|
||||||
|
#.#...#.#.#.....#
|
||||||
|
#.#.#####.#.###.#
|
||||||
|
#.#.#.......#...#
|
||||||
|
#.#.###.#####.###
|
||||||
|
#.#.#...#.....#.#
|
||||||
|
#.#.#.#####.###.#
|
||||||
|
#.#.#.........#.#
|
||||||
|
#.#.#.#########.#
|
||||||
|
#S#.............#
|
||||||
|
#################
|
67
src/day16/puzzle1.typ
Normal file
67
src/day16/puzzle1.typ
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#import "/src/utils.typ": *
|
||||||
|
|
||||||
|
#let START = "S"
|
||||||
|
#let END = "E"
|
||||||
|
#let WALL = "#"
|
||||||
|
#let EMPTY = "."
|
||||||
|
|
||||||
|
#let offsets = (
|
||||||
|
(1, 0),
|
||||||
|
(0, 1),
|
||||||
|
(-1, 0),
|
||||||
|
(0, -1)
|
||||||
|
)
|
||||||
|
|
||||||
|
#let solve(input) = {
|
||||||
|
let grid = input.split("\n").map(l => l.clusters())
|
||||||
|
let w = grid.first().len()
|
||||||
|
let h = grid.len()
|
||||||
|
|
||||||
|
let (sx, sy) = (0, 0)
|
||||||
|
let (ex, ey) = (0, 0)
|
||||||
|
for y in range(h) {
|
||||||
|
for x in range(w) {
|
||||||
|
let c = grid.at(y).at(x)
|
||||||
|
if c == START {
|
||||||
|
(sx, sy) = (x, y)
|
||||||
|
} else if c == END {
|
||||||
|
(ex, ey) = (x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let choices = ((sx, sy, 0, 0),)
|
||||||
|
let (x, y, dir, score) = (0, 0, 0, 0)
|
||||||
|
while choices.len() != 0 {
|
||||||
|
let min-score = calc.min(..choices.map(c => c.last()))
|
||||||
|
let i = choices.position(c => c.last() == min-score)
|
||||||
|
(x, y, dir, score) = choices.remove(i)
|
||||||
|
for (d, (dx, dy)) in offsets.enumerate() {
|
||||||
|
// Ignore backflips
|
||||||
|
if calc.abs(d - dir) == 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
let (x2, y2) = (x + dx, y + dy)
|
||||||
|
let c = grid.at(y2).at(x2)
|
||||||
|
if c == WALL {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
let score2 = score + 1 + if d != dir {1000} else {0}
|
||||||
|
if c == END {
|
||||||
|
return score2
|
||||||
|
}
|
||||||
|
choices.push((x2, y2, d, score2))
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
#show-puzzle(
|
||||||
|
16, 1,
|
||||||
|
solve,
|
||||||
|
example: (
|
||||||
|
"1": 7036,
|
||||||
|
"2": 11048
|
||||||
|
)
|
||||||
|
)
|
0
src/day16/puzzle2.typ
Normal file
0
src/day16/puzzle2.typ
Normal file
BIN
src/main.pdf
BIN
src/main.pdf
Binary file not shown.
Loading…
Reference in New Issue
Block a user