Advent of Code 2023-24a
radulle
javascript
2 years ago
1.5 kB
110
Indexable
const IS_EXAMPLE = true;
function solve(input) {
return process(parse(input));
}
function parse(input) {
return input
.split("\n")
.map((l) => l.split(" @ ").map((e) => e.split(", ").map(Number)));
}
function process(data) {
const MIN = IS_EXAMPLE ? 7 : 200000000000000;
const MAX = IS_EXAMPLE ? 27 : 400000000000000;
let count = 0;
for (let i = 0; i < data.length; i++) {
const [[p1x, p1y], [v1x, v1y]] = data[i];
for (let j = i + 1; j < data.length; j++) {
const [[p2x, p2y], [v2x, v2y]] = data[j];
const result = intersect(
p1x,
p1y,
p1x + v1x,
p1y + v1y,
p2x,
p2y,
p2x + v2x,
p2y + v2y
);
if (!result) continue;
const { x, y } = result;
if (!(x >= MIN && x <= MAX && y >= MIN && y <= MAX)) continue;
if (!(x - p1x > 0 === v1x > 0 && y - p1y > 0 === v1y > 0)) continue;
if (!(x - p2x > 0 === v2x > 0 && y - p2y > 0 === v2y > 0)) continue;
count++;
}
}
return count;
}
function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {
const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
if (denom == 0) return null;
const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denom;
const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denom;
return {
x: x1 + ua * (x2 - x1),
y: y1 + ua * (y2 - y1),
seg1: ua >= 0 && ua <= 1,
seg2: ub >= 0 && ub <= 1,
};
}
Editor is loading...
Leave a Comment