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)
}