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,...