Published
Edited
Dec 17, 2021
Insert cell
# Advent of Code - day 17
Insert cell
simulate = (x0, y0, vx0, vy0) => {
let x = [x0]
let y = [y0]
let vx = [vx0]
let vy = [vy0]
let hit = false
let mint = undefined

for (let t = 1; t < 1000; t++){
y[t] = y[t-1] + vy[t-1]
vy[t] = vy[0] - t
x[t] = x[t-1] + vx[t-1]
vx[t] = (vx0 > 0) ? d3.max([0, vx[0] - t]) : d3.min([0, vx[0] + t])

if (x[t] >= d3.min(targetx) && x[t] <= d3.max(targetx) && y[t] <= d3.max(targety) && y[t] >= d3.min(targety)){
hit = true
mint = t
break
}
}

return { x, y, vx, vy, hit, mint}
}
Insert cell
d3.range(d3.min(targety), 100)
Insert cell
brute = d3.range(d3.min(targety), 100+1).map(vy0 => {
let x0 = 0
let y0 = 0

return d3.range(d3.max(targetx)+1).map(vx0 => {

let { x, y, vx, vy, hit, mint } = simulate(x0, y0, vx0, vy0)
let maxy = d3.max(y)
return { hit, vx0, vy0, x, y, vx, vy, maxy, mint }
})
}).flat()
Insert cell
// d3.max(brute.map(s => s.maxy))
Insert cell
hits = brute
.filter(params => params.hit)
// .filter(params => {
// let { x, y } = params
// return d3.range(1,100).some(t => x[t] >= targetx[0] && x[t] <= targetx[1] && y[t] <= targety[0] && y[t] >= targety[1])
// })
.sort((b,a) => a.maxy - b.maxy)
Insert cell
[d3.min(brute.map(d => d.vx0)),d3.max(brute.map(d => d.vx0))]
Insert cell
[d3.max(brute.map(d => d.vy0)), d3.min(brute.map(d => d.vy0))]
Insert cell
Plot.plot({
width: 1000,
height: 1000,
marks: [
Plot.rect(hits, {
x1: d => d.vx0,
x2: d => d.vx0+1,
y1: d => d.vy0,
y2: d => d.vy0+1,
fill: d => d.mint
})
],
x: {
domain: [d3.min(brute.map(d => d.vx0)),d3.max(brute.map(d => d.vx0))],
label: "vx0",
grid: true
},
y: {
domain: [d3.min(brute.map(d => d.vy0)), d3.max(brute.map(d => d.vy0))],
label: "vy0",
grid: true
}
// y: { axis: false }
})
Insert cell
d3.min(hits.map(s => s.vy0))
Insert cell
d3.min(hits.map(s => s.vy0))
Insert cell
d3.max(hits.map(s => s.mint))
Insert cell
targetx = [257, 286] //[20, 30]
Insert cell
targety = [-101, -57]// [-10, -5]
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more