ps. look out for all my other solutions for Advent of Code challenges here.
See details of the challenge here.
Today’s challenge involves solving two separate problems:
- counting set bits in an integer
- level order tree traversal
For the first problem, I recommend reading through this blog post which covers several approaches and optimizations for this well defined problem.
I experimented with 3 of the solutions described in the post, and the results were telling. I skipped the lookup table version because I don’t feel it makes sense in the context of this AOC challenge.
I recently posted about Level Order Tree Traversal in F# recently, which I also used to solve Day 11. We can apply the same technique and optimization (not counting a previously visited coordinate) here and use Seq.unfold to return an infinite sequence of move count with all the new coordinates that are visited in that move.
Another optimization we can apply is to use memoization to avoid computing if a coordinate is an open space more than once.
To solve part 1 we need to find the first round of coordinates that contains our target.
How many locations (distinct x,y coordinates, including your starting location)
can you reach in at most 50 steps?
Since we’ve done most of the hard work with the travel function (which returns only the distinct coordinates), the hardest thing about part 2 is to remember to add 1 to account for the starting position (which I forgot to initially of course )
- Optimizing bit counting
- Day 13 challenge description
- Advent of Code 2015
- Solution for Day 12
- Solution for Day 11
- All my F# solutions for Advent of Code
- Github repo