const path = require('path'); const fs = require('fs'); const readline = require('readline'); function computeSize(directories, root) { let sum = 0; if (directories[root].size) return directories[root].size; for (let i of directories[root].content) { if (i.size === null) i.size = computeSize(directories, path.join(root, i.name)); sum += i.size; } directories[root].size = sum; return sum; } async function main() { let wd = '/'; let currentDirContent = null; let allDirectories = {}; for await (let line of readline.createInterface({ input: process.stdin })) { if (!line || !line.length) break; if (line.startsWith('$')) { if (currentDirContent) { allDirectories[wd] = { size: null, content: currentDirContent }; currentDirContent = null; } if (line === '$ ls') currentDirContent = []; else if (line.startsWith('$ cd ')) wd = path.join(wd, line.substring(4).trim()) } else if (currentDirContent) { let l = line.split(" "); const size = parseInt(l.shift()); currentDirContent.push({ size: isNaN(size) ? null : size, isDir: isNaN(size), name: l.join(" ") }); } } if (currentDirContent) allDirectories[wd] = { size: null, content: currentDirContent }; computeSize(allDirectories, '/'); // Part 1 console.log(Object.keys(allDirectories).map(i => allDirectories[i].size).filter(i => i < 100000).reduce((tmp, i) => tmp + i)); // Part 2 console.log(Object.keys(allDirectories).map(i => allDirectories[i].size).filter(i => i >= allDirectories['/'].size-40000000).reduce((tmp, i) => Math.min(tmp, i))); }; (main());