10: Add solution to Rust track exercise "Anagram".
[?]
9Zb2bmkejrNknawUtr3MKvVstZkVDR8x8ritfgZXKrky
Dec 23, 2021, 5:31 PM
2MPN73UJBT4AA44CVFCBRLB4BRO44BNASUXTFF3NZIEFN7EGENWQCDependencies
- [2]
YLWBVCK79: Add Rust track exercise "Anagram".
Change contents
- replacement in rust/anagram/tests/anagram.rs at line 4
let result = anagram::anagrams_for(word, inputs);let result = anagram::anagrams_for(word, inputs); - replacement in rust/anagram/tests/anagram.rs at line 6
let expected: HashSet<&str> = expected.iter().cloned().collect();let expected: HashSet<&str> = expected.iter().cloned().collect(); - replacement in rust/anagram/tests/anagram.rs at line 8
assert_eq!(result, expected);assert_eq!(result, expected); - replacement in rust/anagram/tests/anagram.rs at line 13
let word = "diaper";let word = "diaper"; - replacement in rust/anagram/tests/anagram.rs at line 15
let inputs = ["hello", "world", "zombies", "pants"];let inputs = ["hello", "world", "zombies", "pants"]; - replacement in rust/anagram/tests/anagram.rs at line 17
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 19
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 25
let word = "ant";let word = "ant"; - replacement in rust/anagram/tests/anagram.rs at line 27
let inputs = ["tan", "stand", "at"];let inputs = ["tan", "stand", "at"]; - replacement in rust/anagram/tests/anagram.rs at line 29
let outputs = vec!["tan"];let outputs = vec!["tan"]; - replacement in rust/anagram/tests/anagram.rs at line 31
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 37
let word = "galea";let word = "galea"; - replacement in rust/anagram/tests/anagram.rs at line 39
let inputs = ["eagle"];let inputs = ["eagle"]; - replacement in rust/anagram/tests/anagram.rs at line 41
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 43
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 49
let word = "good";let word = "good"; - replacement in rust/anagram/tests/anagram.rs at line 51
let inputs = ["dog", "goody"];let inputs = ["dog", "goody"]; - replacement in rust/anagram/tests/anagram.rs at line 53
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 55
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 61
let word = "listen";let word = "listen"; - replacement in rust/anagram/tests/anagram.rs at line 63
let inputs = ["enlists", "google", "inlets", "banana"];let inputs = ["enlists", "google", "inlets", "banana"]; - replacement in rust/anagram/tests/anagram.rs at line 65
let outputs = vec!["inlets"];let outputs = vec!["inlets"]; - replacement in rust/anagram/tests/anagram.rs at line 67
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 73
let word = "allergy";let word = "allergy"; - replacement in rust/anagram/tests/anagram.rs at line 75
let inputs = ["gallery","ballerina","regally","clergy","largely","leading",];let inputs = ["gallery","ballerina","regally","clergy","largely","leading",]; - replacement in rust/anagram/tests/anagram.rs at line 84
let outputs = vec!["gallery", "regally", "largely"];let outputs = vec!["gallery", "regally", "largely"]; - replacement in rust/anagram/tests/anagram.rs at line 86
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 92
let word = "Orchestra";let word = "Orchestra"; - replacement in rust/anagram/tests/anagram.rs at line 94
let inputs = ["cashregister", "Carthorse", "radishes"];let inputs = ["cashregister", "Carthorse", "radishes"]; - replacement in rust/anagram/tests/anagram.rs at line 96
let outputs = vec!["Carthorse"];let outputs = vec!["Carthorse"]; - replacement in rust/anagram/tests/anagram.rs at line 98
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 104
let word = "ΑΒΓ";let word = "ΑΒΓ"; - replacement in rust/anagram/tests/anagram.rs at line 106
// These words don't make sense, they're just greek letters cobbled together.let inputs = ["ΒΓΑ", "ΒΓΔ", "γβα"];// These words don't make sense, they're just greek letters cobbled together.let inputs = ["ΒΓΑ", "ΒΓΔ", "γβα"]; - replacement in rust/anagram/tests/anagram.rs at line 109
let outputs = vec!["ΒΓΑ", "γβα"];let outputs = vec!["ΒΓΑ", "γβα"]; - replacement in rust/anagram/tests/anagram.rs at line 111
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 117
// 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 = "ΑΒΓ"; - replacement in rust/anagram/tests/anagram.rs at line 121
let inputs = ["ABΓ"];let inputs = ["ABΓ"]; - replacement in rust/anagram/tests/anagram.rs at line 123
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 125
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 131
let word = "banana";let word = "banana"; - replacement in rust/anagram/tests/anagram.rs at line 133
let inputs = ["banana"];let inputs = ["banana"]; - replacement in rust/anagram/tests/anagram.rs at line 135
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 137
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 143
let word = "banana";let word = "banana"; - replacement in rust/anagram/tests/anagram.rs at line 145
let inputs = ["bAnana"];let inputs = ["bAnana"]; - replacement in rust/anagram/tests/anagram.rs at line 147
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 149
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 155
let word = "ΑΒΓ";let word = "ΑΒΓ"; - replacement in rust/anagram/tests/anagram.rs at line 157
let inputs = ["ΑΒγ"];let inputs = ["ΑΒγ"]; - replacement in rust/anagram/tests/anagram.rs at line 159
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 161
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 167
let word = "a⬂"; // 61 E2 AC 82let word = "a⬂"; // 61 E2 AC 82 - replacement in rust/anagram/tests/anagram.rs at line 169
let inputs = ["€a"]; // E2 82 AC 61let inputs = ["€a"]; // E2 82 AC 61 - replacement in rust/anagram/tests/anagram.rs at line 171
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 173
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/tests/anagram.rs at line 179
let word = "bc";let word = "bc"; - replacement in rust/anagram/tests/anagram.rs at line 181
let inputs = ["ad"];let inputs = ["ad"]; - replacement in rust/anagram/tests/anagram.rs at line 183
let outputs = vec![];let outputs = vec![]; - replacement in rust/anagram/tests/anagram.rs at line 185
process_anagram_case(word, &inputs, &outputs);process_anagram_case(word, &inputs, &outputs); - replacement in rust/anagram/src/lib.rs at line 1
use std::collections::HashSet;use std::collections::{HashMap, HashSet};use unicode_segmentation::UnicodeSegmentation;fn checksum(word: &str) -> u8 {word.bytes().fold(0, |accumulator, byte| accumulator.overflowing_add(byte).0)} - replacement in rust/anagram/src/lib.rs at line 9
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},) - edit in rust/anagram/src/lib.rs at line 18[2.3997]
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()} - edit in rust/anagram/Cargo.toml at line 5[2.9071]
[dependencies]unicode-segmentation = "1.8"