solve Day08 in JS/TS
This commit is contained in:
82
Day08/js/solution.js
Normal file
82
Day08/js/solution.js
Normal file
@@ -0,0 +1,82 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function gcd(a, b) {
|
||||
while (b !== 0) {
|
||||
let t = b;
|
||||
b = a % b;
|
||||
a = t;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
function lcm(a, b) {
|
||||
return (a * b) / gcd(a, b);
|
||||
}
|
||||
|
||||
function parseFile(filePath) {
|
||||
console.log(`Parsing file: ${filePath}`);
|
||||
const data = fs.readFileSync(filePath, 'utf8').trim();
|
||||
const [stepsSection, rulesSection] = data.split('\n\n');
|
||||
const steps = stepsSection.split('').map(char => char === 'L' ? 0 : 1);
|
||||
const rules = rulesSection.split('\n').reduce((acc, line) => {
|
||||
const [state, directions] = line.split('=').map(s => s.trim());
|
||||
const [left, right] = directions.split(',').map(s => s.trim());
|
||||
acc['L'][state] = left.slice(1);
|
||||
acc['R'][state] = right.slice(0, -1);
|
||||
return acc;
|
||||
}, { 'L': {}, 'R': {} });
|
||||
|
||||
return { steps, rules };
|
||||
}
|
||||
|
||||
function navigateNetworkSimultaneously(steps, rules) {
|
||||
console.log("Starting navigation of network.");
|
||||
const startNodes = Object.keys(rules['L']).filter(node => node.endsWith('A'));
|
||||
let currentNodes = startNodes;
|
||||
let stepCount = 0;
|
||||
const timeToZ = {};
|
||||
|
||||
while (Object.keys(timeToZ).length < startNodes.length) {
|
||||
currentNodes.forEach((node, index) => {
|
||||
const direction = steps[stepCount % steps.length] === 0 ? 'L' : 'R';
|
||||
const nextNode = rules[direction][node];
|
||||
currentNodes[index] = nextNode;
|
||||
if (nextNode.endsWith('Z') && !(index in timeToZ)) {
|
||||
timeToZ[index] = stepCount + 1;
|
||||
}
|
||||
});
|
||||
stepCount++;
|
||||
console.log(`Step ${stepCount}: Current nodes - ${currentNodes}`);
|
||||
}
|
||||
|
||||
return Object.values(timeToZ).reduce((acc, val) => lcm(acc, val), 1);
|
||||
}
|
||||
|
||||
function runTest() {
|
||||
console.log("Running test...");
|
||||
const testPath = path.join(__dirname, '../test.txt');
|
||||
const { steps, rules } = parseFile(testPath);
|
||||
const expected = 6;
|
||||
const result = navigateNetworkSimultaneously(steps, rules);
|
||||
|
||||
if (result !== expected) {
|
||||
throw new Error(`Test failed: expected ${expected}, got ${result}`);
|
||||
}
|
||||
|
||||
console.log(`Test passed with ${result} steps.`);
|
||||
}
|
||||
|
||||
function main() {
|
||||
try {
|
||||
runTest();
|
||||
const inputPath = path.join(__dirname, '../input.txt');
|
||||
const { steps, rules } = parseFile(inputPath);
|
||||
const result = navigateNetworkSimultaneously(steps, rules);
|
||||
console.log(`All paths reached 'Z' nodes simultaneously in ${result} steps.`);
|
||||
} catch (error) {
|
||||
console.error(`Error: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user