48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
// I wanted to try this one again with a different approach just as an exercise
|
|
// in a more complex, but faster way implementing the solutions
|
|
|
|
const fs = require('fs/promises');
|
|
|
|
(async () => {
|
|
const input = (await fs.readFile("./input.txt", 'utf8')).split("\n");;
|
|
|
|
const path = [];
|
|
|
|
const dirsMap = {};
|
|
|
|
for (const line of input) {
|
|
console.log("PATH ", path);
|
|
if(line === "$ cd /") {
|
|
continue;
|
|
}
|
|
if(line === "$ cd ..") {
|
|
path.pop();
|
|
continue;
|
|
}
|
|
const cdCmd = line.match(/\$ cd (.+)/);
|
|
if(cdCmd) {
|
|
const [_, cdDir] = cdCmd;
|
|
path.push(cdDir);
|
|
continue;
|
|
}
|
|
const file = line.match(/^\d+/);
|
|
if(file) {
|
|
const [size] = file;
|
|
updateDirsOnPath(dirsMap, ["root", ...path], parseFloat(size));
|
|
continue;
|
|
}
|
|
}
|
|
|
|
console.log("ANSWER: ", sum(Object.values(dirsMap).filter(x => x <= 100000)))
|
|
|
|
console.log("ANSWER 2: ", Object.values(dirsMap).reduce((best, cur) => cur > dirsMap.root - 40000000 && cur < best ? cur : best, Infinity));
|
|
})();
|
|
|
|
const updateDirsOnPath = (dirsMap, path, size) => {
|
|
if(!path.length) return;
|
|
const pwd = path.join("/");
|
|
dirsMap[path] = (dirsMap[path] || 0) + size;
|
|
updateDirsOnPath(dirsMap, path.slice(0, -1), size);
|
|
}
|
|
|
|
const sum = (arr) => arr.reduce((total, num) => total+num, 0);
|