DEV Community

Cover image for What more I've learned from the Advent of Code (days 6-8)
Minna N. for Ompeluseura LevelUP Koodarit

Posted on

4

What more I've learned from the Advent of Code (days 6-8)

After a pretty good start, I got stuck on day 7 for a long time and haven't wanted to spend all my precious little free time with AoC. My day 7 recursion was looking pretty good but produced some false positives which I eventually weeded out manually and subtracted from the total. Part 2 is in shambles and I don't have a clear picture of how it should be solved. I heard people are figuring out the puzzles with pen&paper and I might try that, too.

But! I've managed to solve days 6 and 8 with two stars. 😅 Current total: 15🌟

Nifty datatype: Sets

One way to remove duplicate values from an array is to create a set out of it. Values in sets can only occur once. I used this feature on day 6 part 1: I collected all 'yes' answers from a group in an array first and then created the set:

let groupAsSet = [...new Set(groupArray)];
Enter fullscreen mode Exit fullscreen mode

It was then easy to find the number of unique 'yes' answers from the group by set.length.

Destructuring vol.2

I enjoyed solving day 8 (at least part 1 😆). I started by separating the operation and argument.

let [operation, argument] = command.split(' ');
Enter fullscreen mode Exit fullscreen mode

For my original solution, this time I used a regular expression with match method to also separate the sign and digits.

let [_, sign, number] = argument.match(/(\+|\-)(\d+)/);
Enter fullscreen mode Exit fullscreen mode

Using the underscore is the influence of @caiangums. 😊 I saw this usage in his code: the first element in the array that match returns is the whole matched string for the regex between /.../, which I have no use for, and using an underscore nicely depicts that.

Next I used the sign and number to calculate changes in either accumulator or program position (index). I wanted to use the ternary operator here.

sign === '+' ? accumulator += Number.parseInt(number) : accumulator -= Number.parseInt(number);
(...)
sign === '+' ? index += Number.parseInt(number) : index -= Number.parseInt(number);
Enter fullscreen mode Exit fullscreen mode

But... I ended up cleaning up my code and just converted the argument to number directly:

argument = Number.parseInt(argument);
(...)
accumulator += argument;
index += argument;
Enter fullscreen mode Exit fullscreen mode

Much cleaner! Can't believe I didn't think of it right away. 🤦

Reminder: Arrays are reference types

On day 8, my solution was to for loop through the boot code changing one command at a time. First I didn't realize I never "reset" the array at the beginning so I ended up just changing it one line at a time. Then I understood I needed a temporary array to make the one change:

let modifiedCommandArray = commandArray;
Enter fullscreen mode Exit fullscreen mode

The same thing happened again! Then it hit me: oh, right, arrays are reference types so I'm actually modifying the same array but just using a different name. Fixed the code by using the spread operator ....

let modifiedCommandArray = [...commandArray];
Enter fullscreen mode Exit fullscreen mode

Reminder: Include break in your switch

I didn't make this mistake – this time – but I'm quite sure I could and then wonder what's going on. For switch-case structure, you usually want to end your case block with break or all the remaining code will be executed as well. Whoops!

I'm diggin' what my day 8 switch structure looks like:

switch(operation) {
  case 'acc':
    accumulator += argument;
    index++;
    break;
  case 'jmp':
    index += argument;
    break;
  case 'nop':
    index++;
    break;
}
Enter fullscreen mode Exit fullscreen mode

That's all this time! Plodding on. 👢👢

Cover photo by Okwaeze Otusi on Unsplash

SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

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

Okay