Day 11: Plutonian Pebbles
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
3 points
I had a very similar take on this problem, but I was not caching the results of a blink for a single stone, like youre doing with subtree_pointers
. I tried adding that to my solution, but it didn’t make an appreciable difference. I think that caching the lengths is really the only thing that matters.
C#
static object Solve(Input i, int numBlinks)
{
// This is a cache of the tuples of (stoneValue, blinks) to
// the calculated count of their child stones.
var lengthCache = new Dictionary<(long, int), long>();
return i.InitialStones
.Sum(stone => CalculateUltimateLength(stone, numBlinks, lengthCache));
}
static long CalculateUltimateLength(
long stone,
int numBlinks,
IDictionary<(long, int), long> lengthCache)
{
if (numBlinks == 0) return 1;
if (lengthCache.TryGetValue((stone, numBlinks), out var length)) return length;
length = Blink(stone)
.Sum(next => CalculateUltimateLength(next, numBlinks - 1, lengthCache));
lengthCache[(stone, numBlinks)] = length;
return length;
}
static long[] Blink(long stone)
{
if (stone == 0) return [1];
var stoneText = stone.ToString();
if (stoneText.Length % 2 == 0)
{
var halfLength = stoneText.Length / 2;
return
[
long.Parse(stoneText.Substring(0, halfLength)),
long.Parse(stoneText.Substring(halfLength)),
];
}
return [stone * 2024];
}
1 point