Advent of Code 2022: Day 13

Recursion with Arrays with recursion with Arrays with recursion....

by Amy L

HTML

<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/13" target="_blank">Day 13</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>

JavaScript

function Day13(inputData) {
  function solvePart1(packetPairs) {
    const result = comparePacketPairs(packetPairs);
    const sum = result.reduce((subtotal, isInRightOrder, index) => {
    	if (isInRightOrder) {
      	const pairNum = getPacketNumber(index);
      	return subtotal + pairNum;
      } else {
      	return subtotal;
      }
    }, 0);
    return sum;
  }
  function solvePart2(packetPairs) {
  	const packets = packetPairs.reduce((list, packetPair) => {
    	list.push(...packetPair);
      return list;
    }, []);
    const dividers = [[[2]], [[6]]];
    packets.push(...dividers);
    packets.sort(sortByPackets);
    const [firstDividerIndex, secondDividerIndex] = dividers.map((divider) => {
    	const dividerStr = JSON.stringify(divider);
    	const index = packets.findIndex((packet) => JSON.stringify(packet) === dividerStr);
      return getPacketNumber(index);
    });
    return firstDividerIndex * secondDividerIndex;
  }
  const packetPairs = parsePackets(inputData);
  const part1 = solvePart1(packetPairs);
  const part2 = solvePart2(packetPairs);
  return {part1,  part2};
  
}
document.addEventListener('DOMContentLoaded', () => {
  getInputData('INPUT_DATA', (input) => {
  	const answers = Day13(input);
    const [answer1El, answer2El] = [
      document.getElementById('answer1'),
      document.getElementById('answer2')
    ];
    answer1El.value = answers.part1;
    answer2El.value = answers.part2;
  });
});

/*******************************************************************
	Utility libs
**/
function parsePackets(input) {
	return input
  	.split('\n\n')
    .map((packetPair) => packetPair
        .split('\n')
        .map((packet) => JSON.parse(packet))
    );
}
function comparePacketPairs(packetPairs) {
	return packetPairs
    .map((packets, index) => {
    const [left, right] = packets;
    return isInRightOrder(left, right);
  });
}
function isInRightOrder(left, right) {
	if (Array.isArray(left) && !Array.isArray(right)) {
  	return...