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)); }