commit 47ee861bb5ed8eff05a3df7c38864c0ee5377371 Author: Eric Fistons Date: Mon Jun 30 20:53:43 2025 +0200 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..405e450 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "rust-bytes-73" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8d2731a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "rust-bytes-73" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..580f52b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,101 @@ +use std::collections::HashMap; + +fn main() { + println!("{:?}", word_frequency("hello world")); +} + +fn word_frequency(sentence: &str) -> Vec<(String, u32)> { + let mut words: Vec<(String, u32)> = sentence + .split_whitespace() + .map(|x| x.to_lowercase()) + .map(|x| x.chars().filter(|c| c.is_alphabetic()).collect::()) + .filter(|x| !x.is_empty()) + .fold(HashMap::new(), |mut map, word| { + map.entry(word) + .and_modify(|count| *count += 1) + .or_insert(1u32); + map + }) + .iter() + .map(|(word, count)| (word.clone(), *count)) + .collect(); + + words.sort_by(|(a, _), (b, _)| a.cmp(b)); + + words +} + +#[cfg(test)] +mod test { + + use crate::word_frequency; + + #[test] + fn basic_case() { + let input = "The quick brown fox, the quick Brown FOX!"; + let expected = vec![ + ("brown".to_string(), 2), + ("fox".to_string(), 2), + ("quick".to_string(), 2), + ("the".to_string(), 2), + ]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn empty_string() { + let input = ""; + let expected: Vec<(String, u32)> = vec![]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn only_punctuation() { + let input = ".,!?;:-"; + let expected: Vec<(String, u32)> = vec![]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn single_word() { + let input = "hello"; + let expected = vec![("hello".to_string(), 1)]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn multiple_spaces_and_punctuation() { + let input = "hello,,, world!!! HELLO."; + let expected = vec![("hello".to_string(), 2), ("world".to_string(), 1)]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn numbers_and_mixed_chars() { + let input = "test123 test 123test TEST!"; + // let expected = vec![("test".to_string(), 3)]; // 3? For sure? + let expected = vec![("test".to_string(), 4)]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn hyphenated_words() { + let input = "well-known well-Known WELL-KNOWN"; + let expected = vec![("wellknown".to_string(), 3)]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn apostrophes_in_words() { + let input = "don't Don'T cant can't"; + let expected = vec![("cant".to_string(), 2), ("dont".to_string(), 2)]; + assert_eq!(word_frequency(input), expected); + } + + #[test] + fn unicode_words() { + let input = "café CAFÉ résumé Résumé"; + let expected = vec![("café".to_string(), 2), ("résumé".to_string(), 2)]; + assert_eq!(word_frequency(input), expected) + } +}