function readInput(txt) {
let dirs = new Map([
[
"/",
{ parent: undefined, subdirs: [], files: [], name: "/", fullpath: "/" }
]
]);
let files = new Map();
let currentDir = "";
let pathToCurrentDir = [];
for (let line of txt.split("\n").filter((l) => l.trim().length > 0)) {
switch (line[0]) {
case "$":
if (line.slice(2, 4) === "cd") {
let [_, cmd, target] = line.split(" ");
if (target === "..") {
if (pathToCurrentDir.length > 0)
currentDir = pathToCurrentDir.pop();
} else {
let targetFullPath = [...pathToCurrentDir, target].join("/");
let targetDir = dirs.get(targetFullPath);
if (targetDir === undefined) {
dirs.set(targetFullPath, {
parent: currentDir,
subdirs: [],
files: [],
name: target,
fullpath: targetFullPath
});
dirs.get(pathToCurrentDir.join("/")).subdirs.push(targetFullPath);
}
pathToCurrentDir.push(target);
currentDir = target;
}
}
break;
case "d":
let [keyword, dirname] = line.split(" ");
let dirFullPath = [...pathToCurrentDir, dirname].join("/");
if (dirs.get(dirFullPath) === undefined) {
dirs.set(dirFullPath, {
parent: currentDir,
subdirs: [],
files: [],
name: dirname,
fullpath: dirFullPath
});
dirs.get(pathToCurrentDir.join("/")).subdirs.push(dirFullPath);
}
break;
default:
let [size, filename] = line.split(" ");
let filepath = [...pathToCurrentDir, filename].join("/");
if (files.get(filename) === undefined) {
files.set(filepath, parseInt(size));
dirs.get(pathToCurrentDir.join("/")).files.push(filepath);
}
}
}
return {
dirs: dirs,
files: files
};
}