public string GetDecryptedPhrase2(string hash, string targetAnagram) { var anagramCharPool = targetAnagram.Alphabetize(); var targetAnagramRelevantWords = RemoveIrrelevantWords(_words, anagramCharPool); var equivalencyClasses = WordEquivalencyClass.FromWordList(targetAnagramRelevantWords); var candidateAnswer = new WordEquivalencyClassComposition(new List <WordEquivalencyClass>()); //answerType var memo = new Memo(anagramCharPool); var candidateBundles2 = Recursive(candidateAnswer, anagramCharPool, equivalencyClasses, memo, 0); var candidateBundles = memo.Solutions.TempList; foreach (var bundle in candidateBundles) { // construct equivalent phrases var equivalentPhrases = new List <string> { "" }; foreach (var charPoolWithWords in bundle.OrderedListOfWordEquivalencyClasses) { var tempList = new List <string>(); foreach (var word in charPoolWithWords.Words) { foreach (var phraseUnderConstruction in equivalentPhrases) { if (phraseUnderConstruction == "") { tempList.Add(word); } tempList.Add(phraseUnderConstruction + " " + word); } } equivalentPhrases = tempList; } foreach (var phrase in equivalentPhrases) { if (_encrypter.Hash(phrase) == hash) { return(phrase); } } } throw new NoPhraseFound("no phrase found"); }
public void Tests(List <string> wordList, List <WordEquivalencyClass> expected) { var actual = WordEquivalencyClass.GetDictionary(wordList).Select(x => new WordEquivalencyClass(x.Key, x.Value)).ToList(); Assert.Equal(expected.Count, actual.Count); for (int i = 0; i < actual.Count; i++) { Assert.Equal(expected[i].CharPool, actual[i].CharPool); Assert.Equal(expected[i].Words.Count, actual[i].Words.Count); var expectedWords = expected[i].Words.ToArray(); var actualWords = actual[i].Words.ToArray(); for (int j = 0; j < actual[i].Words.Count; j++) { Assert.Equal(expectedWords[j], actualWords[j]); } } }