Advent of Code 2022: Day 1
Summing an Array
by Amy L
HTML
<link rel="stylesheet" href="https://adventofcode.com/static/style.css?30">
<h1><a href="https://adventofcode.com/2022/day/1" target="_blank">Day 1</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 1.7
function Day1(input) {
const inventory = getFoodCarriedPerElf(input);
const totalsPerElf = tallyUpPerElf(inventory);
const {highest, sorted} = findHighest(totalsPerElf);
const caloriesCarriedByTopThree = sorted.slice(0, 3)
.map((carried) => carried.total);
return {
part1: highest.total,
part2: sumValuesInList(caloriesCarriedByTopThree)
};
}
document.addEventListener('DOMContentLoaded', () => {
getInputData('INPUT_DATA', (input) => {
const answers = Day1(input);
const [answer1El, answer2El] = [
document.getElementById('answer1'),
document.getElementById('answer2')
];
answer1El.value = answers.part1;
answer2El.value = answers.part2;
});
});
/*******************************************************************
Utility libs
**/
function getFoodCarriedPerElf(inputData) {
const parsePerElf = inputData.split('\n\n');
const totalInventory = parsePerElf.map((perElf) => {
return perElf.split('\n').filter((line) => /\w/.test(line));
});
return totalInventory;
}
function tallyUpPerElf(inventory) {
return inventory.map((perElf, elfIndex) => {
return {
elf: elfIndex++,
total: sumValuesInList(perElf)
};
});
}
function sumValuesInList(list) {
return list.reduce((subtotal, carriedItem) => {
return subtotal += parseInt(carriedItem, 10);
}, 0)
}
function findHighest(list) {
const descending = [...list].sort((a, b) => {
return (a.total > b.total) ? -1 : 1;
});
return {
highest: descending[0],
sorted: descending
};
}
function getInputData(inputId, callback) {
const dataEl = document.getElementById(inputId);
dataEl.addEventListener('input', () => callback(dataEl.value));
if (dataEl.value) callback(dataEl.value)
}