Advent of Code F# – Day 18

Yan Cui

I help clients go faster for less using serverless technologies.

The source code for this post (both Part 1 and Part 2) is available here and you can click here to see my solutions for the other Advent of Code challenges.

Description for today’s challenge is here.

 

This is a modified version of the Day 6 challenge, with a twist of course.

So, we’ll start by creating a 100×100 2D array to represent our grid of lights. As per the instruction, we’ll read the input and use # to set the original state of a light to ON, and . to set the original state of a light to OFF.

day18_01

Next, let’s add a function to count the number of neighbours that are ON, whilst taking into account that lights on the edge of the grid won’t have all 8 neighbours:

day18_02

Then we’ll simulate 100 steps, each step would use the state from the previous step in a fold:

day18_03

Finally, count the number of lights that are ON in the state after 100 steps:

day18_04v2

 

Part 2

All else stays the same, we just need to inject additional logic to check if the light is one of the corner lights in a few places.

First, let’s add a function to determine if a light is in the corner:

day18_05

and now we need to use it when setting the initial state for our grid:

day18_06

as well as when we step from one state to the next:

day18_07

and that’s it. After you made these couple of changes, all the rest of the code from Part 1 would work like before.

Whenever you’re ready, here are 3 ways I can help you:

  1. Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop to level up your serverless skills quickly.
  2. Do you want to know how to test serverless architectures with a fast dev & test loop? Check out my latest course, Testing Serverless Architectures and learn the smart way to test serverless.
  3. I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.

Leave a Comment

Your email address will not be published. Required fields are marked *