96 lines
3.2 KiB
JavaScript
96 lines
3.2 KiB
JavaScript
const fs = require('fs');
|
|
|
|
function parseInput(filePath) {
|
|
console.log(`Parsing input from ${filePath}`);
|
|
const data = fs.readFileSync(filePath, 'utf8').trim().split('\n\n');
|
|
const seedsLine = data.shift().split(':')[1].trim();
|
|
const seedsRanges = seedsLine.split(/\s+/).map(Number);
|
|
const seedsNumbers = [];
|
|
|
|
for (let i = 0; i < seedsRanges.length; i += 2) {
|
|
seedsNumbers.push([seedsRanges[i], seedsRanges[i] + seedsRanges[i + 1]]);
|
|
}
|
|
|
|
const categories = data.map(category => {
|
|
return category.split('\n').slice(1).map(line => line.split(/\s+/).map(Number));
|
|
});
|
|
|
|
console.log(`Parsed ${seedsNumbers.length} seed ranges and ${categories.length} categories`);
|
|
return { seedsNumbers, categories };
|
|
}
|
|
|
|
function processCategories(seedsNumbers, categories) {
|
|
console.log('Processing categories');
|
|
categories.forEach((category, index) => {
|
|
console.log(`Processing category ${index + 1}`);
|
|
let sources = [];
|
|
while (seedsNumbers.length) {
|
|
const [start, end] = seedsNumbers.pop();
|
|
let found = false;
|
|
for (const [destination, source, length] of category) {
|
|
const overlapStart = Math.max(start, source);
|
|
const overlapEnd = Math.min(end, source + length);
|
|
if (overlapStart < overlapEnd) {
|
|
found = true;
|
|
sources.push([overlapStart - source + destination, overlapEnd - source + destination]);
|
|
if (overlapStart > start) {
|
|
seedsNumbers.push([start, overlapStart]);
|
|
}
|
|
if (end > overlapEnd) {
|
|
seedsNumbers.push([overlapEnd, end]);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
sources.push([start, end]);
|
|
}
|
|
}
|
|
seedsNumbers = sources;
|
|
});
|
|
|
|
console.log('Completed processing categories');
|
|
return seedsNumbers;
|
|
}
|
|
|
|
function findLowestLocation(filePath) {
|
|
try {
|
|
console.log(`Finding lowest location for file: ${filePath}`);
|
|
const { seedsNumbers, categories } = parseInput(filePath);
|
|
const processedSeeds = processCategories(seedsNumbers, categories);
|
|
const lowestLocation = Math.min(...processedSeeds.flat());
|
|
console.log(`Lowest location found: ${lowestLocation}`);
|
|
return lowestLocation;
|
|
} catch (error) {
|
|
console.error(`An error occurred processing '${filePath}': ${error.message}`);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
function test() {
|
|
console.log('Starting test');
|
|
const expected = 46;
|
|
try {
|
|
const result = findLowestLocation('../test.txt');
|
|
if (result !== expected) {
|
|
throw new Error(`Test failed, expected ${expected} but got ${result}`);
|
|
}
|
|
console.log('Test passed.');
|
|
} catch (error) {
|
|
console.error(`Test error: ${error.message}`);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
function main() {
|
|
try {
|
|
test();
|
|
const result = findLowestLocation('../input.txt');
|
|
console.log(`Total result from input.txt: ${result}`);
|
|
} catch (error) {
|
|
console.error(`An error occurred in main: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
main();
|