Published
Edited
Dec 3, 2019
1 fork
1 star
Insert cell
Insert cell
Insert cell
Insert cell
lines = puzzleInput.split('\n').map(l=>l.split(","))
Insert cell
s1 = points(lines[0]);
Insert cell
s2 = points(lines[1]);
Insert cell
part1 = answer(lines)
Insert cell
answer = function (lines) {
// let s1 = points(lines[0]);
// let s2 = points(lines[1]);
// too slow
// let common = p1.filter( p =>
// p2.some( pp => pp[0] == p[0] && pp[1] == p[1] )
// )
let common = [], i = 0, j = 0, cross;
for (i=0; i < s1.length; i++) {
let p1 = s1[i];
let p1min = p1.bbox[0];
let p1max = p1.bbox[1];
for (j=0; j<s2.length; j++) {
let p2 = s2[j];
let p2min = p2.bbox[0];
let p2max = p2.bbox[1];
if (p2min[0]>p1max[0]) continue
if (p2max[0]<p1min[0]) continue
if (p2min[1]>p1max[1]) continue
if (p2max[1]<p1min[1]) continue
let cross = p1.points.filter(
p => p2.points.some (
pp => pp[0] == p[0] && pp[1] == p[1]
)
);
if (cross.length) common.push(...cross)
}
}
let dists = common.map( p => Math.abs(p[0])+Math.abs(p[1]));
return {dist: Math.min(...dists), pts: common}
}
Insert cell
test1 = `R75,D30,R83,U83,L12,D49,R71,U7,L72
U62,R66,U55,R34,D71,R55,D58,R83`
Insert cell
t1 = test1.split('\n').map(l=>l.split(","))
Insert cell
answer(t1)
Insert cell
answer(['R8,U5,L5,D3'.split(','), 'U7,R6,D4,L4'.split(',')])
Insert cell
points = function (line) {
let current = { points: [[0,0]], bbox: [] };
let mover = {
"R" : (o, offset) => {
return {
points: Array(offset).fill().map((v, i) => [o[0]+i+1,o[1]]),
bbox: [o,[o[0]+offset,o[1]]]
}},
"L" : (o, offset) => {
return {
points: Array(offset).fill().map((v, i) => [o[0]-i-1,o[1]]),
bbox: [[o[0]-offset,o[1]],o]
}},
"U" : (o, offset) => {
return {
points: Array(offset).fill().map((v, i) => [o[0],o[1]+i+1]),
bbox: [o,[o[0],o[1]+offset]]
}},
"D" : (o, offset) => {
return {
points: Array(offset).fill().map((v, i) => [o[0],o[1]-i-1]),
bbox: [[o[0],o[1]-offset],o]
}}
}
let points = line.map ( move => {
current = mover[move.slice(0,1)](current.points[current.points.length-1], move.slice(1)*1.0);
return current
}, [])
return points
}

Insert cell
function sum (a) { return a.reduce((a,b)=>a+b,0) }
Insert cell
Insert cell
steps = function (segments, target) {
const points = segments.reduce ((a, s) => a.concat(s.points), []);
return points.findIndex( p => p[0] == target[0] && p[1] == target[1] )+1
}
Insert cell
steps(s1, part1.pts[1])
Insert cell
part2 = {
let stepsums = part1.pts.map( target => steps(s1, target) + steps(s2, target) );
return {min: Math.min(...stepsums), sums: stepsums}
}
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