day 14 puzzle 1

This commit is contained in:
2024-12-15 12:03:32 +01:00
parent ad4adc2372
commit 6ab8ef6d26
7 changed files with 82 additions and 1 deletions

61
src/day14/puzzle1.typ Normal file
View File

@ -0,0 +1,61 @@
#import "/src/utils.typ": *
#let regexp = regex("^p=(.*?),(.*?) v=(.*?),(.*?)$")
#let simulate(v0, dv, max: 1, steps: 1) = {
return calc.rem-euclid(v0 + dv * steps, max)
}
#let solve(w: 0, h: 0, steps: 100, input) = {
assert(w != 0, message: "Width must be != 0")
assert(h != 0, message: "Height must be != 0")
let bots = input.split("\n").map(b => {
let m = b.match(regexp)
return (
pos: (
x: int(m.captures.at(0)),
y: int(m.captures.at(1)),
),
vel: (
x: int(m.captures.at(2)),
y: int(m.captures.at(3))
)
)
})
let quadrants = (
tl: 0,
tr: 0,
bl: 0,
br: 0
)
let half-w = calc.div-euclid(w, 2)
let half-h = calc.div-euclid(h, 2)
let sim-x = simulate.with(max: w, steps: steps)
let sim-y = simulate.with(max: h, steps: steps)
for bot in bots {
let x2 = sim-x(bot.pos.x, bot.vel.x)
let y2 = sim-y(bot.pos.y, bot.vel.y)
if x2 == half-w or y2 == half-h {
continue
}
let quadrant = (
(if y2 < half-h {"t"} else {"b"}) +
(if x2 < half-w {"l"} else {"r"})
)
quadrants.at(quadrant) += 1
}
return quadrants.values().product()
}
#show-puzzle(
14, 1,
solve.with(w: 101, h: 103),
example: (
(result: 12, args: (w: 11, h: 7)),
)
)

0
src/day14/puzzle2.typ Normal file
View File