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