use crate::dictionary_builder::Dictionary; use crate::dictionary_builder::WordInfo; use crate::permutations_cache::PermutationsCache; pub fn get_anagram_view(anagram: &Vec, dictionary: &Dictionary) -> String { anagram.iter() .map(|&index| { let word_options = &dictionary.words[index]; if word_options.len() == 1 { word_options[0].word.clone() } else { format!("[{}]", word_options.iter().map(|word_info| word_info.word.clone()).collect::>().join(",")) } }) .collect::>() .join(" ") } fn generate_substitutions(simple_dictionary: &[Vec], remaining_length: usize) -> Vec> { if remaining_length == 0 { return vec![Vec::new()]; } return simple_dictionary[remaining_length - 1].iter() .flat_map(|&value| { generate_substitutions(simple_dictionary, remaining_length - 1).into_iter() .map(move |mut partial_substitution| { partial_substitution.push(value); partial_substitution }) }) .collect(); } pub fn log_anagrams(anagram_vector: &Vec, dictionary: &Dictionary, permutations: &PermutationsCache) -> () { let simple_vector: Vec = (0..anagram_vector.len()).collect(); let simple_dictionary: Vec> = (0..anagram_vector.len()) .map(|i| dictionary.words[anagram_vector[i]].iter().map(|word_info| word_info).collect()) .collect(); let substitutions: Vec> = generate_substitutions::<&WordInfo>(&simple_dictionary, simple_dictionary.len()); permutations.get_permuted_vectors(&simple_vector).iter() .flat_map(|permuted_vector| { substitutions.iter().map(move |substitution| { permuted_vector.iter().map(|&index| substitution[index]).collect::>() }) }) .for_each(|anagram| { let phrase = anagram.iter() .map(|word_info| word_info.word.clone()) .collect::>() .join(" "); println!("{}", phrase); }) }