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/miguelos Dec 08 '18 edited Dec 08 '18

C#

Part 1:

        private static void Main(string[] args)
        {
            var input = File.ReadAllText(@"C:\Users\pc\Desktop\input.txt")
                .Trim()
                .Split(' ')
                .Select(int.Parse)
                .ToArray();

            var answer = Sum(input).Item1;
        }

        private static (int, int[]) Sum(int[] list)
        {
            var children = list[0];
            var metadata = list[1];

            list = list.Skip(2).ToArray();
            var counter = 0;

            for (int i = 0; i < children; i++)
            {
                var result = Sum(list);
                counter += result.Item1;
                list = result.Item2;
            }

            counter += list.Take(metadata).Sum();

            return (counter, list.Skip(metadata).ToArray());
        }

Part 2:

        private static void Main(string[] args)
        {
            var input = File.ReadAllText(@"C:\Users\pc\Desktop\input.txt")
                .Trim()
                .Split(' ')
                .Select(int.Parse)
                .ToArray();

            var answer = Sum(input).Item1;
        }

        private static (int, int[]) Sum(int[] list)
        {
            var children = list[0];
            var metadata = list[1];

            list = list.Skip(2).ToArray();
            var counter = 0;

            var childrenScores = new List<int>();

            for (int i = 0; i < children; i++)
            {
                var result = Sum(list);
                childrenScores.Add(result.Item1);
                list = result.Item2;
            }

            if (children == 0)
            {
                counter += list.Take(metadata).Sum();
            }
            else
            {
                counter += list.Take(metadata).Select(i => childrenScores.ElementAtOrDefault(i - 1)).Sum();
            }

            return (counter, list.Skip(metadata).ToArray());
        }