public void CartesianProductTest(IEnumerable <IEnumerable <int> > listOfLists, IEnumerable <IEnumerable <int> > expectedResult) { var cartesian = Permutations.CartesianProduct(listOfLists); if (cartesian == null) { Assert.That(cartesian, Is.EqualTo(expectedResult)); } else { Assert.That(cartesian, Is.EquivalentTo(expectedResult)); } }
public IEnumerable <string> Solve(UnknownWord unknownWord, int[] subWordCount) { // call SetSubWordCounts just for the validation it does unknownWord.SetSubWordCounts(subWordCount); string[] wordsToSolve = { unknownWord.WordPattern }; if (subWordCount != null) { wordsToSolve = new string[subWordCount.Length]; var pattern = unknownWord.WordPattern; var currentIdx = 0; for (var i = 0; i < subWordCount.Length; i++) { var wordCount = subWordCount[i]; var subWord = pattern.Substring(currentIdx, wordCount); wordsToSolve[i] = subWord; currentIdx += wordCount; } } else { subWordCount = new [] { unknownWord.WordPattern.Length }; } var matches = new List <string> [wordsToSolve.Length]; for (var i = 0; i < matches.Length; i++) { var allWordsOfLen = KnownWords.AllWordsOfLength(subWordCount[i]); matches[i] = new List <string>(); foreach (var word in allWordsOfLen) { if (_IsMatch(wordsToSolve[i], word)) { matches[i].Add(word); } } } foreach (var wordList in matches) { wordList.Sort(); } var allPossiblePhrases = Permutations.CartesianProduct(matches); var formattedPhrases = allPossiblePhrases.Select(phrase => string.Join(" ", phrase)); return(formattedPhrases.ToList()); }