Public
Edited
Dec 7, 2022
Insert cell
Insert cell
Insert cell
parse = (input) => {
const dirTree = {};
const dirStack = [dirTree];
const lines = input.split("\n");
let cwd = dirTree;

for (let i = 0; i < lines.length; i++) {
const tokens = lines[i].split(" ");

if (tokens[1] === "cd") {
if (tokens[2] === "/") {
cwd = dirTree;
dirStack.splice(0); // clear the stack
dirStack.push(dirTree);
} else if (tokens[2] === "..") {
cwd = dirStack.pop();
} else {
dirStack.push(cwd);
cwd = cwd[tokens[2]];
}
} else if (tokens[1] === "ls") {
i++;

while (i < lines.length && lines[i][0] !== "$") {
const fileTokens = lines[i].split(" ");
const name = fileTokens[1];
cwd[name] = fileTokens[0] === "dir" ? {} : parseInt(fileTokens[0]);
i++;
}

if (i < lines.length && lines[i][0] === "$") i--;
}
}

return dirTree;
}
Insert cell
parse(testInput)
Insert cell
sum = (a, b) => a + b
Insert cell
function dirSize(dir) {
return Object.keys(dir)
.map((f) => (Number.isInteger(dir[f]) ? dir[f] : dirSize(dir[f])))
.reduce(sum);
}
Insert cell
dirSize(parse(testInput))
Insert cell
subDirs = (dir) => Object.keys(dir).filter((f) => !Number.isInteger(dir[f]))
Insert cell
subDirs(parse(testInput))
Insert cell
function walkDirTree(dir, dirCallback) {
subDirs(dir).forEach((subdir) => {
dirCallback(subdir, dir[subdir]);
walkDirTree(dir[subdir], dirCallback);
});
}
Insert cell
part1 = (input) => {
const dirTree = parse(input);
let sum = 0;
walkDirTree(dirTree, (name, dir) => {
const size = dirSize(dir);
if (size <= 100000) sum += size;
});
return sum;
}
Insert cell
part1(testInput)
Insert cell
Insert cell
part1(input)
Insert cell
Insert cell
Insert cell
part2 = (input) => {
const dirTree = parse(input);
const diskUsage = dirSize(dirTree);
const freeSpace = diskSize - diskUsage;
// return freeSpace;
const targetSize = spaceNeeded - freeSpace;
// return targetSize;

let sizes = [dirSize(dirTree)];

walkDirTree(dirTree, (name, dir) => sizes.push(dirSize(dir)));
return sizes.filter((n) => n >= targetSize).sort((a, b) => a - b)[0];
}
Insert cell
part2(testInput)
Insert cell
part2(input)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more