Advent of Code F# – Day 15

Presently sponsored by Serverless Guru: Your guide to cloud excellence, helping you every step of your serverless journey, including team training, pattern development, mass service migrations, architecting, and developing new solutions. Speak to a Guru today.

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.


First, let’s capture what an ingredient is in our model:


Notice that we’ve also added the + and * operators to make combining different ingredients and multiplying by quantity easier when we mix them together to make and score a cake:


The input for this challenge looks like the following:

Sprinkles: capacity 2, durability 0, flavor -2, texture 0, calories 3

Butterscotch: capacity 0, durability 5, flavor -3, texture 0, calories 3

Chocolate: capacity 0, durability 0, flavor 5, texture -1, calories 8

Candy: capacity 0, durability -1, flavor 0, texture 5, calories 8

so let’s parse them into our model:


here I have reused the same Regex active pattern as Day 7 to parse each line.

Next, from the list of ingredients, we need to work out all combinations of them that add to a total of 100 ingredients being used:


From the above code, accN means the total number of ingredients accumulated so far – it saves me from having to calculate it each time. For each kind of ingredients, we may include 0 to 100 of it – 0 = don’t use this ingredient in the cake; 100 = make the cake out of only this ingredient. In hindsight, based on the data, you can’t make a cake with a non-zero score if you have 100 of any ingredient as each ingredient has a negative value for one of its attributes.

Finally, for each combination, make and score the cake and find the highest score:



Part 2

Not much needs to change here, except we need to filter out cakes whose calories count is not 500:


Leave a Comment

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