|
|
@@ -0,0 +1,56 @@
|
|
|
+
|
|
|
+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());
|
|
|
+
|