generated from eric/adventofcode2023
day eight both parts
This commit is contained in:
120
08/code.js
Normal file
120
08/code.js
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user