Exemple #1
0
            public static long CalculateHighScore(int players, int finalMarble)
            {
                var scores = new Dictionary <int, long>();

                for (int playerIndex = 0; playerIndex <= players - 1; playerIndex++)
                {
                    scores.Add(playerIndex, 0);
                }
                var            currPlayer = 0;
                DoubleLinkNode currNode   = new DoubleLinkNode()
                {
                    Value = 0
                };

                currNode.Prev = currNode;
                currNode.Next = currNode;
                currNode.AddAfter(1);
                for (int marbleCount = 2; marbleCount <= finalMarble; marbleCount++)
                {
                    if (marbleCount % 23 == 0)
                    {
                        scores[currPlayer] += marbleCount;

                        currNode            = currNode.MoveBackward(7);
                        scores[currPlayer] += currNode.Value;
                        currNode            = currNode.Remove();
                    }
                    else
                    {
                        currNode = currNode.MoveForward(1);
                        currNode = currNode.AddAfter(marbleCount);
                    }
                    currPlayer = (currPlayer + 1) % players;
                }

                return(scores.Max(x => x.Value));
            }