public static BigInteger[] Mixbonacci(string[] patterns, int n) { // Build sequence map var patternList = patterns.ToList(); var sequenceMap = patternList .Distinct() .Select(pattern => new { Pattern = pattern, Strategy = Kata.GetNacciStrategy(pattern) }) .ToDictionary(obj => obj.Pattern, obj => obj.Strategy.GetSequence(n).ToList()); //var patternCountMap = Enumerable.Repeat(0, patterns.Length).ToArray(); Dictionary <string, int> patternCountMap = new Dictionary <string, int>(); foreach (string pattern in patterns) { if (!patternCountMap.ContainsKey(pattern)) { patternCountMap.Add(pattern, 0); } } var actual = new List <BigInteger>(n); for (int i = 0; i < n; i++) { int patternIndex = i % patterns.Length; string pattern = patterns[patternIndex]; int mapIndex = patternCountMap[pattern]++; actual.Add(sequenceMap[pattern][mapIndex]); } return(actual.ToArray()); }