Advent of Code 2022: Day 7
Trees and recursion
by Amy L
HTML
<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/7" target="_blank">Day 7</a></h1>
<diV class="puzzle-input">
<label for="INPUT_DATA">Input</label>
<textarea id="INPUT_DATA" autocomplete="off" placeholder="paste your input here" rows="7" cols="50"></textarea>
</diV>
<dl>
<dt>Part 1</dt>
<dd>
<label>Answer:
<input type="text" id="answer1" readonly />
</label>
</dd>
<dt>Part 2</dt>
<dd>
<label>Answer:
<input type="text" id="answer2" readonly />
</label>
</dd>
</dl>
CSS
dd {
margin-bottom: 1rem;
}
TypeScript
const FILE_SYSTEM = {
CAPACITY: 70000000,
REQUIRED_UNUSED: 30000000
};
function Day7(input: string) {
function solvePart1(directories: Directory[]): number {
return directories
.filter((directory: Directory) => directory.size <= 100000)
.reduce((subtotal: number, directory: Directory) => subtotal + directory.size, 0);
}
function solvePart2(directories: Directory[], rootDir: Directory): number {
const sortedDirectories = [...directories];
sortedDirectories.sort(sortByFileSizeAscending);
const totalUsedSize = rootDir.size;
const spaceAvailable = FILE_SYSTEM.CAPACITY - totalUsedSize;
const minRequiredToFreeUp = FILE_SYSTEM.REQUIRED_UNUSED - spaceAvailable;
return sortedDirectories
.find((directory) => directory.size >= minRequiredToFreeUp)
?.size ?? 0;
}
const commands: Command[] = parseLog(input);
const rootDir: Directory = buildFileSystem(commands);
//console.log('Root',rootDir)
const directories: Directory[] = findAllDirectories([], rootDir);
//console.log('all',directories)
const part1 = solvePart1(directories);
const part2 = solvePart2(directories, rootDir);
return {part1, part2};
}
document.addEventListener('DOMContentLoaded', () => {
getInputData('INPUT_DATA', (input: string) => {
const answers = Day7(input);
const [answer1El, answer2El] = [
document.getElementById('answer1'),
document.getElementById('answer2')
];
(answer1El as HTMLTextAreaElement).value = answers.part1 as unknown as string;
(answer2El as HTMLTextAreaElement).value = answers.part2 as unknown as string;
});
});
/*******************************************************************
Utility libs
**/
function parseLog(log: string): Command[] {
return log.split(/^\$ /m)
.filter((line: string) => line.trim().length > 0)
.map(parseCommandLine);
function parseCommandLine(line: string): Command {
const argDelimiter = line.indexOf('\n');
const firstLine = line.substring(0,...