DEV Community

Cover image for Stream Processing
Robert Mion
Robert Mion

Posted on

Stream Processing

Advent of Code 2017 Day 9

Try the simulator using your puzzle input!

Final moments of simulator

Part 1

  1. Walking the line...again
  2. A for loop and a flag
  3. Writing and testing my algorithm

Walking the line...again

I'm reminded of 2021 Day 10: Syntax Scoring

A few differences:

  • Syntax Scoring was a list of strings; this puzzle features one long string
  • Syntax Scoring started with identifying corrupted strings: where an opening symbol was properly closed; this puzzle features a correct string...filled with garbage!
  • Syntax Scoring was a challenge of tracking and matching opening and closing symbols of the same type; this puzzle is similar, but with more to track given the inclusion of garbage data
  • Syntax Scoring algorithm walked the string; I anticipate doing the same in this puzzle

A for loop and a flag

I think those will be the core aspects of my algorithm:

Initialize a flag for garbage mode to false For each character in the string If in garbage mode Check for exclamation marks If one is encountered, skip a character Keep walking If not in garbage mode If next character is < Enter garbage mode Else, if next character is { Account for another group, possibly at the same or next level Else if next character is } Update the accumulating score to account for the group that just closed Else if next character is anything else Keep walking 
Enter fullscreen mode Exit fullscreen mode

There's probably some finer details in the conditions that I'm missing, but that's an outline of the algorithm I intend to write.

Let's see how far off I was...assuming I can write a working algorithm!

Writing and testing my algorithm

Thankfully, the instructions offer plenty of unit tests.

I'm going to write this algorithm piece by piece, condition by condition, ensuring I pass some simpler tests, then the more complicated ones...then hopefully my puzzle input.

Getting examples 1-4 to work

{} = 1 {{{}}} = 6 {{},{}} = 5 {{{},{},{{}}}} = 16 
Enter fullscreen mode Exit fullscreen mode

My working algorithm:

Setup: Split the input at each character into an array of characters Create score, starting at 0 Create level, starting at 1 Loop: For each character in the stream except the last Depending on what the next character is: If it is a { Increment level by 1 Else, if it is a } Increment score by level Decrement level Return score 
Enter fullscreen mode Exit fullscreen mode

Now, to start accounting for garbage.

Getting example 6, 7 and 9 to work

{<a>,<a>,<a>,<a>} = 1 {{<a>},{<a>},{<a>},{<a>}} = 9 {{<ab>},{<ab>},{<ab>},{<ab>}} = 9 
Enter fullscreen mode Exit fullscreen mode

My working algorithm:

Setup: Split the input at each character into an array of characters Create score, starting at 0 Create level, starting at 1 Create flag for garbage mode, starting at false Loop: For each character in the stream except the last Depending on what the next character is: If garbage mode is on If it is a > Turn garbage mode off Else, garbage mode is off If it is a { Increment level by 1 Else, if it is a } Increment score by level Decrement level Else, if it is a < Turn garbage mode on Return score 
Enter fullscreen mode Exit fullscreen mode

Getting examples 8, 10 and 11 to work

{{<!>},{<!>},{<!>},{<a>}} = 3 {{<!!>},{<!!>},{<!!>},{<!!>}} = 9 {{<a!>},{<a!>},{<a!>},{<ab>}} = 3 
Enter fullscreen mode Exit fullscreen mode

My working algorithm:

Setup: Split the input at each character into an array of characters Create score, starting at 0 Create level, starting at 1 Create flag for garbage mode, starting at false Loop: For each character in the stream except the last Depending on what the next character is: If garbage mode is on If it is a > Turn garbage mode off If it is a ! Increment the character location tracker by 1 to skip a character in the stream Else, garbage mode is off If it is a { Increment level by 1 Else, if it is a } Increment score by level Decrement level Else, if it is a < Turn garbage mode on Return score 
Enter fullscreen mode Exit fullscreen mode

Testing on my puzzle input

  • It finished!
  • It generated the correct answer!

Part 2

  1. Garbage collection, of course!

Garbage collection, of course!

I'm hopeful I just need to add a tracking counter, and a statement that increments it by one in the proper case in one of my switch statements.

My working algorithm:

Setup: Split the input at each character into an array of characters Create score, starting at 0 Create level, starting at 1 Create flag for garbage mode, starting at false Create garbage, starting at 0 Loop: For each character in the stream except the last Depending on what the next character is: If garbage mode is on If it is a > Turn garbage mode off If it is a ! Increment the character location tracker by 1 to skip a character in the stream Otherwise Increment garbage by 1 Else, garbage mode is off If it is a { Increment level by 1 Else, if it is a } Increment score by level Decrement level Else, if it is a < Turn garbage mode on Return garbage 
Enter fullscreen mode Exit fullscreen mode

That's all it took to generate the correct answer for Part 2!

I did it!!

  • I solved both parts!
  • I did so by writing my algorithm piece by piece, solving only a few examples at a time
  • I used a few switch statements, which I don't use too often throughout these puzzles; I often opt for dictionaries so I can leverage key-value look-ups
  • I built a simulator to watch the stream get processed in front of my eyes!

I'm glad I didn't try solving this puzzle all at once, or I may have struggled more than necessary.

Top comments (0)