Beispiel #1
0
        private static void Play(string prefix, int numberOfPlayers, int numberOfMarbels)
        {
            var currentPlayer = 0;
            var score         = new long[numberOfPlayers + 1];
            var gamefield     = new LinkedList <int>();
            LinkedListNode <int> currentNode = gamefield.AddFirst(0);
            var consoleSpinner = new ConsoleSpiner();

            for (var i = 1; i <= numberOfMarbels; i++)
            {
                currentPlayer = Math.Max(1, ++currentPlayer % (numberOfPlayers + 1));

                if (i % 23 == 0)
                {
                    score[currentPlayer] += i;
                    var moveLeft = 7;

                    while (moveLeft > 0)
                    {
                        moveLeft--;
                        currentNode = currentNode.Previous ?? gamefield.Last;
                    }

                    score[currentPlayer] += currentNode.Value;

                    LinkedListNode <int> next = currentNode.Next ?? gamefield.First;

                    gamefield.Remove(currentNode);
                    currentNode = next;
                }
                else
                {
                    currentNode = gamefield.AddAfter(currentNode.Next ?? gamefield.First, i);
                }

                if (i % 1000 == 0)
                {
                    consoleSpinner.Spin();
                }
            }

            consoleSpinner.Done();
            Console.WriteLine($"{prefix}: The winning elfs score is \"{score.Max()}\"");
        }
        private static void Main(string[] args)
        {
            ManualResetEvent ctrlC = GetExitEvent();
            var recipes            = new LinkedList <Recipe>();
            var elves           = new[] { new Elf(), new Elf() };
            var sequence        = "030121";
            int numberOfRecipes = int.Parse(sequence);

            elves[0].CurrentRecipe = recipes.AddFirst(new Recipe(GetNextReceipeIndex(), 3));
            elves[1].CurrentRecipe = recipes.AddLast(new Recipe(GetNextReceipeIndex(), 7));

            var consoleSpinner = new ConsoleSpiner();

            for (var i = 0; i < numberOfRecipes + 10; i++)
            {
                if (i % 1000 == 0)
                {
                    consoleSpinner.Spin();
                }

                GenerateRecipes(recipes, elves);
            }

            consoleSpinner.Done();

            LinkedListNode <Recipe> next = recipes.First;

            for (var i = 0; i < numberOfRecipes; i++)
            {
                next = next.Next;
            }

            var sb = new StringBuilder();

            for (var j = 0; j < 10; j++)
            {
                sb.Append(next.Value.Score);
                next = next.Next;
            }

            Console.WriteLine($"Day 14: The score of the next then recipes after the first \"{numberOfRecipes}\" is \"{sb}\"");

            next = recipes.First;
            var predicate = new int[sequence.Length];
            var k         = 0;

            while (true)
            {
                k++;

                if (k % 100000 == 0)
                {
                    consoleSpinner.Spin();
                }

                Array.Copy(predicate, 1, predicate, 0, predicate.Length - 1);
                predicate[predicate.Length - 1] = next.Value.Score;

                if (string.Join("", predicate) == sequence)
                {
                    break;
                }

                if (next.Next == null)
                {
                    GenerateRecipes(recipes, elves);
                }

                next = next.Next;
            }

            consoleSpinner.Done();
            Console.WriteLine($"Part Two: \"{next.Previous.Value.Index + 1 - sequence.Length}\" recipies appear on the scoreboard to the left.");

            ctrlC.WaitOne();
        }