JSFiddle - React, Tailwind, and code Playground
JavaScript
const solver = () => {
let input = document.body.childNodes[0].innerHTML.trim().split('\n').map((str) => str.split(', ').reduce((arr,cv, i) => {
if (i === 0) {
arr.x = parseInt(cv.substring(13));
} else if (i === 1) {
arr.y = parseInt(cv.substring(0, 6));
arr.xV = parseInt(cv.substring(cv.indexOf('<') + 4));
} else {
arr.yV = parseInt(cv.substring(0, cv.length - 1));
}
return arr;
}, {}));
let min = Number.MAX_VALUE;
let i = 0;
while (true) {
let max = Number.MIN_VALUE;
input.forEach(obj => {
obj.x += obj.xV;
obj.y += obj.yV;
if (Math.abs(obj.y) > max) max = Math.abs(obj.y);
});
if (max < min) min = max;
else {
input.forEach(obj => {
obj.x -= obj.xV;
obj.y -= obj.yV;
});
break;
};
i++;
}
let minX = Number.MAX_VALUE;
let minY = Number.MAX_VALUE;
let maxX = Number.MIN_VALUE;
let maxY = Number.MIN_VALUE;
input.forEach(obj => {
if (obj.x < minX) minX = obj.x;
if (obj.y < minY) minY = obj.y;
if (obj.x > maxX) maxX = obj.x;
if (obj.y > maxY) maxY = obj.y;
});
let grid = [];
let totalX = Math.abs(maxX) + 2;
let totalY = Math.abs(maxY) + 2;
for (let i = 0; i < totalY; i++) {
grid.push([]);
for (let j = 0; j < totalX; j++) {
grid[i].push('.');
}
}
input.forEach(obj => grid[obj.y][obj.x] = '#');
if (minY > 0) grid = grid.slice(minY - 1);
if (minX > 0) grid = grid.map(arr => arr.slice(minX - 1));
let string = '';
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
string += grid[i][j];
}
string += '\n';
}
console.log(string);
return i;
}
solver();