day 14 puzzle 1

This commit is contained in:
Louis Heredero 2024-12-15 12:03:32 +01:00
parent ad4adc2372
commit 6ab8ef6d26
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
7 changed files with 82 additions and 1 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

View File

@ -23,4 +23,6 @@
12:
stars: 2
13:
stars: 2
stars: 2
14:
stars: 1

12
res/examples/day14.txt Normal file
View File

@ -0,0 +1,12 @@
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3

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

Binary file not shown.

View File

@ -81,6 +81,12 @@
for (suffix, result) in example.pairs() {
check-example(day, func, result, suffix: suffix)
}
} else if type(example) == array {
for ex in example {
let suffix = ex.at("suffix", default: none)
let args = ex.at("args", default: (:))
check-example(day, func.with(..args), ex.result, suffix: suffix)
}
} else {
check-example(day, func, example)
}