RLDSDI3CZTZJRUN2DYOPB4JZ4YPHVV3NTJ5EMIMLRBAWTSSJT55AC
// Despite what a human might think these words contain different letters, the input uses Greek
// A and B while the list of potential anagrams uses Latin A and B.
let word = "ΑΒΓ";
// Despite what a human might think these words contain different letters, the input uses Greek
// A and B while the list of potential anagrams uses Latin A and B.
let word = "ΑΒΓ";
pub fn anagrams_for<'a>(word: &str, possible_anagrams: &[&str]) -> HashSet<&'a str> {
unimplemented!(
"For the '{}' word find anagrams among the following words: {:?}",
word,
possible_anagrams
);
fn grapheme_histogram(word: &str) -> HashMap<&str, usize> {
word.graphemes(true).fold(
HashMap::with_capacity(word.len()),
|mut hashmap, grapheme| {
*hashmap.entry(grapheme).or_insert(0) += 1;
hashmap
},
)
pub fn anagrams_for<'a>(word: &str, possible_anagrams: &[&'a str]) -> HashSet<&'a str> {
let word_lowercased = word.to_lowercase();
let (word_checksum, word_histogram) = (
checksum(&word_lowercased),
grapheme_histogram(&word_lowercased),
);
possible_anagrams
.iter()
.filter(|possible_anagram| {
word.len() == possible_anagram.len() && {
let possible_anagram = possible_anagram.to_lowercase();
word_lowercased != possible_anagram
&& word_checksum == checksum(&possible_anagram)
&& word_histogram == grapheme_histogram(&possible_anagram)
}
})
.copied()
.collect()
}
[dependencies]
unicode-segmentation = "1.8"