More browser antics. I think I can refactor this, and possibly make it faster, but it's fast enough.
function crosswires() { let pretext = document.getElementsByTagName('pre')[0].innerHTML; let wires = pretext.split('\n').filter(w => w !== '').map(w => w.split(',')); let points = [[{x:0, y:0}],[{x:0, y:0}]]; let crosspoints = {}; let bestpoint = {x:Number.MAX_SAFE_INTEGER, y:Number.MAX_SAFE_INTEGER}; for(let stepi = 0; stepi < wires[0].length; stepi++) { let wire0step = wires[0][stepi]; let wire1step = wires[1][stepi]; let wire0points = stepToPoints(points[0][points[0].length-1], wire0step); for(let p0 of wire0points) { if(p0.x in crosspoints) { if(p0.y in crosspoints[p0.x]) { crosspoints[p0.x][p0.y][0] = true; } else { crosspoints[p0.x][p0.y] = {0:true, 1: false}; } } else { let obj = {}; obj[p0.y] = {0:true, 1:false}; crosspoints[p0.x] = obj; } } points[0] = points[0].concat(wire0points); let wire1points = stepToPoints(points[1][points[1].length-1], wire1step); for(let p1 of wire1points) { if(p1.x in crosspoints) { if(p1.y in crosspoints[p1.x]) { crosspoints[p1.x][p1.y][1] = true; } else { crosspoints[p1.x][p1.y] = {0: false, 1: true}; } } else { let obj = {}; obj[p1.y] = {0:false, 1:true}; crosspoints[p1.x] = obj; } } points[1] = points[1].concat(wire1points); } for(let x in crosspoints) { for(let y in crosspoints[x]) { if(crosspoints[x][y][0] && crosspoints[x][y][1]) { if(Math.abs(x) + Math.abs(y) < Math.abs(bestpoint.x) + Math.abs(bestpoint.y)) { bestpoint = {x:x, y:y}; } } } } return bestpoint; } function crosswires2() { let pretext = document.getElementsByTagName('pre')[0].innerHTML; let wires = pretext.split('\n').filter(w => w !== '').map(w => w.split(',')); let points = [[{x:0, y:0}],[{x:0, y:0}]]; let steps = [0, 0] let crosspoints = {}; let beststeps = Number.MAX_SAFE_INTEGER; for(let stepi = 0; stepi < wires[0].length; stepi++) { let wire0step = wires[0][stepi]; let wire1step = wires[1][stepi]; let wire0points = stepToPoints(points[0][points[0].length-1], wire0step); for(let p0 of wire0points) { steps[0]++; if(p0.x in crosspoints) { if(p0.y in crosspoints[p0.x]) { if(crosspoints[p0.x][p0.y][0] == -1) { crosspoints[p0.x][p0.y][0] = steps[0]; } } else { crosspoints[p0.x][p0.y] = {0:steps[0], 1: -1}; } } else { let obj = {}; obj[p0.y] = {0:steps[0], 1:-1}; crosspoints[p0.x] = obj; } } points[0] = points[0].concat(wire0points); let wire1points = stepToPoints(points[1][points[1].length-1], wire1step); for(let p1 of wire1points) { steps[1]++; if(p1.x in crosspoints) { if(p1.y in crosspoints[p1.x]) { if(crosspoints[p1.x][p1.y][1] == -1) { crosspoints[p1.x][p1.y][1] = steps[1]; } } else { crosspoints[p1.x][p1.y] = {0: -1, 1: steps[1]}; } } else { let obj = {}; obj[p1.y] = {0:-1, 1:steps[1]}; crosspoints[p1.x] = obj; } } points[1] = points[1].concat(wire1points); } for(let x in crosspoints) { for(let y in crosspoints[x]) { if(crosspoints[x][y][0] > -1 && crosspoints[x][y][1] > -1) { let steps = crosspoints[x][y][0] + crosspoints[x][y][1]; if(steps < beststeps) { beststeps = steps; } } } } return beststeps; } function stepToPoints(curPoint, step) { let dist = parseInt(step.slice(1)); let points = []; for(let i = 1; i <= dist; i++) { let nextPoint = {x:curPoint.x, y:curPoint.y}; switch(step[0]) { case 'U': nextPoint.y += i; break; case 'D': nextPoint.y -= i; break; case 'L': nextPoint.x += i; break case 'R': nextPoint.x -= i; break; } points.push(nextPoint); } return points; }
Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink.
Hide child comments as well
Confirm
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
More browser antics. I think I can refactor this, and possibly make it faster, but it's fast enough.