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