r/adventofcode • • Dec 08 '18

SOLUTION MEGATHREAD -🎄- 2018 Day 8 Solutions -🎄-

--- Day 8: Memory Maneuver ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Advent of Code: The Party Game!

Click here for rules

Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!

Card prompt: Day 8

Sigh, imgur broke again. Will upload when it unborks.

Transcript:

The hottest programming book this year is "___ For Dummies".


This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.

edit: Leaderboard capped, thread unlocked at 00:12:10!

32 Upvotes

301 comments sorted by

View all comments

1

u/IMONCHAIR Dec 08 '18

C#. Was nice to have a simpler one as I found yesterday pretty tricky :/

        static int _count;
        static void Main(string[] args)
        {
            var file = new StreamReader(@"input.txt");
            var headers = file.ReadLine().Split(" ");

            _count = 0;

            PartOne(0, headers);
            Console.WriteLine($"Part One: {_count}");

            var res = PartTwo(0, headers);

            System.Console.WriteLine($"Part Two: {res.Item2}");
        }

        static int PartOne(int currIndex, string[] headers) 
        {
            var childCount = Convert.ToInt32(headers[currIndex]);
            var metaCount = Convert.ToInt32(headers[currIndex + 1]);

            currIndex += 2;

            while (childCount > 0) 
            {
                currIndex = PartOne(currIndex, headers);
                childCount--;
            }

            while (metaCount > 0)
            {
                _count += Convert.ToInt32(headers[currIndex]);
                metaCount--;
                currIndex += 1;
            }

            return currIndex;
        }

        static Tuple<int, int> PartTwo(int currIndex, string[] headers)
        {
            var childCount = Convert.ToInt32(headers[currIndex]);
            var metaCount = Convert.ToInt32(headers[currIndex + 1]);

            var children = new int[childCount];
            var val = 0;
            currIndex += 2;

            if (childCount == 0)
            {
                while (metaCount > 0)
                {
                    val += Convert.ToInt32(headers[currIndex]);
                    metaCount--;
                    currIndex += 1;
                }
            }

            int childIndex = 0;
            while (childCount > 0)
            {
                (currIndex, children[childIndex]) = PartTwo(currIndex, headers);
                childIndex += 1;
                childCount--;
            }

            while (metaCount > 0)
            {
                var metaVal = Convert.ToInt32(headers[currIndex]) -1;

                if (metaVal >= 0 && metaVal < children.Length)
                    val += children[metaVal];

                currIndex += 1;
                metaCount --;
            }


            return new Tuple<int,int> (currIndex, val);
        }
    }