day eight both parts

This commit is contained in:
Eric Wagoner
2025-12-09 00:30:06 -05:00
parent 42b2af4452
commit 7bbedb47a5

120
08/code.js Normal file
View File

@@ -0,0 +1,120 @@
import { readFileSync } from 'node:fs';
let sampleMode = false;
let usedArray = [];
const sampleArray = readFileSync('sample.txt').toString().split("\n");
const inputArray = readFileSync('input.txt').toString().split("\n");
if (sampleMode) {
usedArray = sampleArray;
} else {
usedArray = inputArray;
}
// Part One
console.time("part1");
let coordinatesArray = [];
for (const element of usedArray) {
const coordinates = element.split(",");
coordinatesArray.push({ x: Number.parseInt(coordinates[0]), y: Number.parseInt(coordinates[1]), z: Number.parseInt(coordinates[2]) });
}
let segments = [];
let parent = {};
for (let i = 0; i < coordinatesArray.length; i++) {
for (let j = i + 1; j < coordinatesArray.length; j++) {
const x2 = Math.pow(coordinatesArray[i].x - coordinatesArray[j].x, 2);
const y2 = Math.pow(coordinatesArray[i].y - coordinatesArray[j].y, 2);
const z2 = Math.pow(coordinatesArray[i].z - coordinatesArray[j].z, 2);
const distance = Math.sqrt(x2 + y2 + z2);
segments.push({ from: i, to: j, distance });
}
}
segments.sort((a, b) => a.distance - b.distance);
const shortest = segments.slice(0, sampleMode ? 10 : 1000);
for (const seg of shortest) {
union(seg.from, seg.to);
}
const circuits = {};
for (const seg of shortest) {
const root = find(seg.from);
circuits[root] = circuits[root] || new Set();
circuits[root].add(seg.from);
circuits[root].add(seg.to);
}
const circuitList = Object.values(circuits);
const sizes = circuitList.map(nodes => nodes.size).sort((a, b) => b - a);
const result = sizes[0] * sizes[1] * sizes[2];
console.timeEnd("part1");
console.log(result);
// Part Two
console.time("part2");
coordinatesArray = [];
for (const element of usedArray) {
const coordinates = element.split(",");
coordinatesArray.push({ x: Number.parseInt(coordinates[0]), y: Number.parseInt(coordinates[1]), z: Number.parseInt(coordinates[2]) });
}
segments = [];
parent = {};
for (let i = 0; i < coordinatesArray.length; i++) {
for (let j = i + 1; j < coordinatesArray.length; j++) {
const x2 = Math.pow(coordinatesArray[i].x - coordinatesArray[j].x, 2);
const y2 = Math.pow(coordinatesArray[i].y - coordinatesArray[j].y, 2);
const z2 = Math.pow(coordinatesArray[i].z - coordinatesArray[j].z, 2);
const distance = Math.sqrt(x2 + y2 + z2);
segments.push({ from: i, to: j, distance });
}
}
segments.sort((a, b) => a.distance - b.distance);
let circuitCount = coordinatesArray.length;
let lastSegment;
for (const seg of segments) {
const rootFrom = find(seg.from);
const rootTo = find(seg.to);
if (rootFrom !== rootTo) {
union(seg.from, seg.to);
circuitCount--;
lastSegment = seg;
if (circuitCount === 1) break;
}
}
const result2 = coordinatesArray[lastSegment.from].x * coordinatesArray[lastSegment.to].x;
console.timeEnd("part2");
console.log(result2);
// functions
function find(x) {
if (parent[x] === undefined) parent[x] = x;
if (parent[x] !== x) parent[x] = find(parent[x]);
return parent[x];
}
function union(a, b) {
const rootA = find(a);
const rootB = find(b);
if (rootA !== rootB) {
parent[rootA] = rootB;
}
}