advent_of_code_2023/Day18/js/solution.js
2023-12-18 17:54:36 +01:00

70 lines
2.2 KiB
JavaScript

const fs = require('fs');
function parseInstructions(filePath) {
try {
const fileContent = fs.readFileSync(filePath, 'utf8');
const lines = fileContent.trim().split('\n'); // Trim to remove extra newlines
console.log(`Parsed ${lines.length} instructions from ${filePath}`);
return lines;
} catch (error) {
console.error(`Error reading file ${filePath}: ${error}`);
throw error;
}
}
function calculateArea(lines) {
const DIRECTIONS = [[0, 1], [1, 0], [0, -1], [-1, 0]];
let points = [[0, 0]];
let boundary = 0;
for (const line of lines) {
if (!line) continue; // Skip empty lines
const color = line.split(' ').pop();
const instructions = color.slice(2, -1);
const directionIndex = parseInt(instructions.slice(-1), 16);
const [dr, dc] = DIRECTIONS[directionIndex];
const steps = parseInt(instructions.slice(0, -1), 16);
boundary += steps;
const [row, column] = points[points.length - 1];
points.push([row + dr * steps, column + dc * steps]);
}
let area = 0;
for (let i = 0; i < points.length; i++) {
const [x1, y1] = points[i];
const [x2, y2] = points[(i + 1) % points.length];
area += x1 * y2 - x2 * y1;
}
return Math.abs(area) / 2 + Math.floor(boundary / 2) + 1;
}
function runTest(testFile, expectedResult) {
const lines = parseInstructions(testFile);
const calculatedArea = calculateArea(lines);
if (calculatedArea !== expectedResult) {
throw new Error(`Test failed, expected ${expectedResult}, got ${calculatedArea}`);
}
console.log(`Test passed, area: ${calculatedArea}`);
}
function main() {
const testFile = "../test.txt";
const inputFile = "../input.txt";
const expectedTestArea = 952408144115; // Replace with the correct expected area for the test
try {
runTest(testFile, expectedTestArea);
// Process actual puzzle input
const lines = parseInstructions(inputFile);
const area = calculateArea(lines);
console.log(`Puzzle result (area): ${area}`);
} catch (error) {
console.error(`Execution halted due to error: ${error}`);
}
}
main();