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

  • SteveDinn@lemmy.ca
    link
    fedilink
    arrow-up
    3
    ·
    15 days ago

    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];
        }
    
    • hades@lemm.ee
      link
      fedilink
      arrow-up
      1
      ·
      15 days ago

      I think that caching the lengths is really the only thing that matters.

      Yep, it is just a dynamic programming problem really.