Esempio n. 1
0
        public static long Problem1(int numberOfPlayers, long marbles)
        {
            LinkedList <int> marbleCircle = new LinkedList <int>();

            marbleCircle.AddFirst(1);
            marbleCircle.AddFirst(0);

            LinkedList <Player> lstPlayers = new LinkedList <Player>();

            for (int i = 1; i < numberOfPlayers + 1; i++)
            {
                lstPlayers.AddLast(new Player(i));
            }

            var currentPlayer = lstPlayers.First.Next.Next;
            //int currentPlayer = 3;

            LinkedListNode <int> leCurrentNode = marbleCircle.Last;

            for (int currentMarble = 2; currentMarble < marbles; currentMarble++)
            {
                var marble = currentMarble;

                if (marble % 23 != 0)
                {
                    var insertPosition = Util.GetNextCircular(leCurrentNode);
                    leCurrentNode = marbleCircle.AddAfter(insertPosition, currentMarble);
                }
                else
                {
                    var player = currentPlayer;//lstPlayers.SingleOrDefault(r => r.playerID == currentPlayer);
                    player.Value.score += marble;

                    var insertPosition = Util.GetPreviousCircular(leCurrentNode, 7);
                    player.Value.score += insertPosition.Value;
                    leCurrentNode       = Util.GetNextCircular(insertPosition);
                    marbleCircle.Remove(insertPosition);
                }
                currentPlayer = Util.GetNextCircular(currentPlayer);//lstPlayers.ElementAt(GetNextCircular(lstPlayers.Count, currentPlayer - 1)).playerID;
            }

            return(lstPlayers.Max(r => r.score));
        }