| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 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());
|