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

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

Top comments (0)