From 3d57434c04a669610d5f15bd2a7713e6928cdef7 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Thu, 30 Nov 2023 22:46:45 -0700 Subject: add aoc2023 --- aoc_2022/day-06/sol.js | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 aoc_2022/day-06/sol.js (limited to 'aoc_2022/day-06/sol.js') diff --git a/aoc_2022/day-06/sol.js b/aoc_2022/day-06/sol.js new file mode 100644 index 0000000..28b7b0d --- /dev/null +++ b/aoc_2022/day-06/sol.js @@ -0,0 +1,115 @@ +import input from "fs"; + +class File { + constructor(name, size, parent) { + this.name = name; + this.fileSize = size; + this.parent = parent; + } + + size() { + return this.fileSize; + } +} + +class Directory { + constructor(name, parent) { + this.children = []; + this.name = name; + this.parent = parent; + } + + add(child) { + this.children.push(child); + } + + size() { + return this.children.reduce((acc, child) => acc + child.size(), 0); + } + + searchDirectoresOfSizePredicate(sizeP) { + const dirs = []; + for (const child of this.children) { + if (child instanceof Directory) { + if (sizeP(child.size())) { + dirs.push(child); + } + dirs.push(...child.searchDirectoresOfSizePredicate(sizeP)); + } + } + return dirs; + } +} + +class OS { + constructor() { + this.root = new Directory("/", null); + + this.current = this.root; + } + + cd(path) { + if (path === "/") { + this.current = this.root; + } else if (path === ".." && this.current.parent) { + this.current = this.current.parent; + } else { + this.current = this.current.children.find((child) => child.name === path); + } + } + + printFs() { + const print = (dir, depth) => { + for (const child of dir.children) { + console.log(" ".repeat(depth) + child.name); + if (child instanceof Directory) { + print(child, depth + 1); + } + } + }; + + print(this.root, 0); + } +} + +const main = () => { + const os = new OS(); + const lines = input.readFileSync("input", "utf8").split("\n"); + + let currentCommand = null; + for (const line of lines) { + if (line.startsWith("$")) { + const [command, path] = line.split(" ").splice(1); + if (command == "cd") os.cd(path); + currentCommand = command; + } else if (currentCommand == "ls") { + const [dirOrSize, name] = line.split(" "); + if (dirOrSize === "dir") { + const dir = new Directory(name, os.current); + os.current.add(dir); + } else { + const file = new File(name, parseInt(dirOrSize), os.current); + os.current.add(file); + } + } + } + + //os.printFs(); + + console.log( + os.root + .searchDirectoresOfSizePredicate((size) => size <= 100000) + .reduce((a, x) => a + x.size(), 0) + ); + + const rootSize = os.root.size(); + const freeSpace = 70000000 - rootSize; + console.log( + [...os.root.searchDirectoresOfSizePredicate(() => true), os.root] + .map((x) => x.size()) + .filter((x) => freeSpace + x >= 30000000) + .reduce((a, x) => Math.min(a, x), Infinity) + ); +}; + +main(); -- cgit v1.2.3-70-g09d2