DEV Community 👩‍💻👨‍💻

Cover image for Calorie Counting
Robert Mion
Robert Mion

Posted on

Calorie Counting

Advent of Code 2022 Day 1

Part 1

  1. Another great lesson in reduce
  2. My algorithm in pseudocode
  3. My algorithm in JavaScript

Another great lesson in reduce

  • From a collection of Elvish calorie counts
  • I want to derive an integer
  • Which represents an amount of calories
  • Associated with the Elf who eats the most calories

Why use reduce()?

  • reduce() is a built-in array method
  • that accumulates one item (can be of any data type)
  • updating that accumulating item after operating on each item in the array
  • tracking the item's value, index, and the source array
  • and returns the accumulated item

I'll take two reduce()ers, please!

  1. A reduce() to iterate through each Elf
  2. A reduce() to iterate through one Elf's itemized calories

My algorithm in pseudocode

Split the input at each double newline character to create an array of strings representing each Elf

For each Elf, accumulate an integer, starting at 0:
  Split the string at each newline character to create an array of strings representing each food's calorie count

  For each string, accumulate a number starting at 0:
    Coerce the string to an integer
    Increment the accumulating number by the integer
    Return the accumulated number

  If this Elf's calorie count is greater than the current largest count
    Update the accumulating integer to reflect this Elf's calorie count

  Return the accumulated integer
Enter fullscreen mode Exit fullscreen mode

My algorithm in JavaScript

return input
  .split('\n\n')
  .reduce((answer, elf) => {
    const calories = elf
      .split('\n')
      .map(Number)
      .reduce((sum, count) => sum + count)
    return answer < calories ? calories : answer
  }, 0)
Enter fullscreen mode Exit fullscreen mode

Part 2

  1. Make that three reduce()ers, please!
  2. My algorithm in pseudocode
  3. My algorithm in JavaScript

Make that three reduce()ers, please!

  1. A reduce() to iterate through each Elf
  2. A reduce() to iterate through one Elf's itemized calories
  3. A reduce() to sum up the three largest calories

My algorithm in pseudocode

Split the input at each double newline character to create an array of strings representing each Elf

For each Elf, accumulate an array that is initially empty:
  Split the string at each newline character to create an array of strings representing each food's calorie count

  For each string, accumulate a number starting at 0:
    Coerce the string to an integer
    Increment the accumulating number by the integer
    Return the accumulated number

  Add the current Elf's calorie count to the accumulating array

  Return the accumulated array

Sort the array's numbers in descending order
Extract only the first three numbers - the largest ones
For each number, accumulate a sum
Return the sum
Enter fullscreen mode Exit fullscreen mode

My algorithm in JavaScript

return input
  .split('\n\n')
  .reduce((winner, elf) => {
    const calories = elf
      .split('\n')
      .map(Number)
      .reduce((sum, count) => sum + count)
    winner.push(calories)
    return winner
  }, [])
  .sort((a, b) => b - a)
  .slice(0, 3)
  .reduce((sum, count) => sum + count)
Enter fullscreen mode Exit fullscreen mode

I did it!!

  • I solved both parts!
  • I misread the instructions for Part 1. I thought the answer was a particular Elf. But it was just the calorie count, so my code got even simpler!
  • I loved the twist of Part 2, requiring a post-reduce sort and slice!
  • I made a GIF to visualize how my algorithms work!

Never a dull challenge in AoC!

Even the relatively easier ones are great practice!

Top comments (0)

Stop sifting through your feed.

Find the content you want to see.

Change your feed algorithm by adjusting your experience level and give weights to the tags you follow.