main.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const path = require('path');
  2. const fs = require('fs');
  3. const readline = require('readline');
  4. function computeSize(directories, root) {
  5. let sum = 0;
  6. if (directories[root].size)
  7. return directories[root].size;
  8. for (let i of directories[root].content) {
  9. if (i.size === null)
  10. i.size = computeSize(directories, path.join(root, i.name));
  11. sum += i.size;
  12. }
  13. directories[root].size = sum;
  14. return sum;
  15. }
  16. async function main() {
  17. let wd = '/';
  18. let currentDirContent = null;
  19. let allDirectories = {};
  20. for await (let line of readline.createInterface({ input: process.stdin })) {
  21. if (!line || !line.length)
  22. break;
  23. if (line.startsWith('$')) {
  24. if (currentDirContent) {
  25. allDirectories[wd] = { size: null, content: currentDirContent };
  26. currentDirContent = null;
  27. }
  28. if (line === '$ ls')
  29. currentDirContent = [];
  30. else if (line.startsWith('$ cd '))
  31. wd = path.join(wd, line.substring(4).trim())
  32. } else if (currentDirContent) {
  33. let l = line.split(" ");
  34. const size = parseInt(l.shift());
  35. currentDirContent.push({
  36. size: isNaN(size) ? null : size,
  37. isDir: isNaN(size),
  38. name: l.join(" ")
  39. });
  40. }
  41. }
  42. if (currentDirContent)
  43. allDirectories[wd] = { size: null, content: currentDirContent };
  44. computeSize(allDirectories, '/');
  45. // Part 1
  46. console.log(Object.keys(allDirectories).map(i => allDirectories[i].size).filter(i => i < 100000).reduce((tmp, i) => tmp + i));
  47. // Part 2
  48. console.log(Object.keys(allDirectories).map(i => allDirectories[i].size).filter(i => i >= allDirectories['/'].size-40000000).reduce((tmp, i) => Math.min(tmp, i)));
  49. };
  50. (main());