static int[] findSignatureCounts(int[] masterPassItToStudent) { if (masterPassItToStudent == null || masterPassItToStudent.Length == 0) { throw new ArgumentException("Invalid Parameter"); } IGameBuilder gameBuilder = new GameBuilder(); Dictionary <IIdentifier, IParticipant> studentDictionary = new Dictionary <IIdentifier, IParticipant>(masterPassItToStudent.Length); List <int> signCount = new List <int>(masterPassItToStudent.Length); int[] passItToStudent = masterPassItToStudent; int nonParticpantCount; do { List <int> nextPassItToStudent = new List <int>(passItToStudent.Length); signCount.Clear(); nonParticpantCount = 0; for (int index = 0; index < passItToStudent.Length; index++) { IIdentifier studentIdentifierPassFrom = gameBuilder.CreateIdentifier(index + 1); IIdentifier studentIdentifierPassTo = gameBuilder.CreateIdentifier(passItToStudent[index]); if (Convert.ToInt32(studentIdentifierPassTo.GetIdentifier()) < 1) { throw new Exception("Value less than zero not allowed."); } //If new Student then add to dictionary and sign their yearbook IParticipant studentPassFrom = GetOrAddParticipantIfMissing(gameBuilder, studentDictionary, studentIdentifierPassFrom); //If new Student then add to dictionary and sign their yearbook IParticipant studentPassTo = GetOrAddParticipantIfMissing(gameBuilder, studentDictionary, studentIdentifierPassTo); if (!studentPassFrom.Equals(studentPassTo)) { IYearBook yearBook = studentPassFrom.PassYearBook(); studentPassTo.RecieveYearBook(yearBook); } else { studentPassFrom.NoLongerAllowedToParticipate(); } nextPassItToStudent.Add(masterPassItToStudent[passItToStudent[index] - 1]); } for (int index = 0; index < passItToStudent.Length; index++) { IIdentifier studentIdentifier = gameBuilder.CreateIdentifier(index + 1); IParticipant student = studentDictionary[studentIdentifier]; student.Sign(); signCount.Add(student.GetMyYearBook().GetSignedStudents().Count); if (!student.IsParticipant()) { nonParticpantCount++; } } passItToStudent = nextPassItToStudent.ToArray(); } while (nonParticpantCount != masterPassItToStudent.Length); return(signCount.ToArray()); }