DEV Community

Cover image for I Was Told There Would Be No Math
Robert Mion
Robert Mion

Posted on

I Was Told There Would Be No Math

Advent of Code 2015 Day 2

Part 1

  1. Oh, there will be plenty of math.
  2. Using several familiar tools in my toolbox

Oh, there will be plenty of math.

Much to my delight, a majority of the math throughout Advent of Code was in celebration of patterns underlying various scientific, arithmetic or algorithmic formulas and proofs.

Using several familiar tools in my toolbox

  • reduce() to accumulate a total
  • split() to turn a string into an array
  • map() to coerce or manipulate data
  • array destructuring to concisely extract and store multiple values
  • sort() to, well, sort numbers
  • slice() to extract a subset of items from an array

My algorithm in JavaScript:

input.reduce(
  (sqft, box) => {
    let [l, w, h] = box.split('x').map(Number)
    let smallestArea = [l, w, h]
      .sort((a, b) => a - b)
      .slice(0, 2)
      .reduce((a, c) => a * c)
    return sqft += 2*l*w + 2*w*h + 2*h*l + smallestArea
  }
, 0)
Enter fullscreen mode Exit fullscreen mode

Part 2

A minor mathematical tweak

  • A shorter equation
  • And a relatively unchanged algorithm

My algorithm in JavaScript:

input.reduce(
  (sqft, box) => {
    let [l, w, h] = box.split('x').map(Number)
    let smallestPerimeter = [l, w, h]
      .sort((a, b) => a - b)
      .slice(0, 2)
      .map(el => el * 2)
      .reduce((a, c) => a + c)
    return sqft += l*w*h + smallestPerimeter
  }
, 0)
Enter fullscreen mode Exit fullscreen mode

Both parts, a year ago

This was my working algorithm in JavaScript when I first solved this puzzle:

function dayTwoPart1(input) {
  return input.map(box => wrappingPaperFor(box))
              .reduce((acc, curr) => { return acc + curr }, 0)
}

function dayTwoPart2(input) {
  return input.map(box => ribbonFor(box))
              .reduce((acc, curr) => { return acc + curr }, 0)
}

function wrappingPaperFor(box) {
  return surfaceAreaFor(box) + slackFor(box)
}

function surfaceAreaFor(box) {
  let [l, w, h] = box.split("x").map(i => +i)
  return (2 * l * w) + (2 * w * h) + (2 * h * l)
}

function slackFor(box) {
  let sortedBox = box.split("x").map(i => +i).sort((a,b) => a - b)
  return sortedBox[0] * sortedBox[1]
}
function ribbonFor(box) {
    let [s1, s2, s3] = box.split("x").map(i => +i).sort((a,b) => a - b)
    return (s1 + s1 + s2 + s2) + (s1 * s2 * s3)
}
Enter fullscreen mode Exit fullscreen mode
  • It's all very straightforward
  • Almost to its detriment
  • Then again, this puzzle did require a lot of straightforward math
  • Much like with Day 3, I'm very proud of the code I wrote my second time around

I did it!!

  • I solved both parts!
  • At first in a very separated, functional approach...then again in a more chained-together, eloquent approach!

While the math in this puzzle wasn't too intriguing, it served as a callback to all of the other puzzles that featured wonderfully-intriguing math.

One day left!

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay