You've already forked rust-tutor
second exercise!
- create exercise string manipulator (shout out claude) - finish hacky solution (it almost works)
This commit is contained in:
6
exercises/string-manipulator/Cargo.toml
Normal file
6
exercises/string-manipulator/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "string-manipulator"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
87
exercises/string-manipulator/src/main.rs
Normal file
87
exercises/string-manipulator/src/main.rs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut test = StringTool::new();
|
||||||
|
|
||||||
|
test.add_string("hello".to_string());
|
||||||
|
test.add_string("world".to_string());
|
||||||
|
test.add_string("rust programming".to_string());
|
||||||
|
println!("\nDEBUG: current values\n\t{:?}", test);
|
||||||
|
|
||||||
|
let word = "o".to_string();
|
||||||
|
let strings_with_word = test.contains_word(&word);
|
||||||
|
println!(
|
||||||
|
"DEBUG: string(s) with {word} are:\n\t{:?}",
|
||||||
|
strings_with_word
|
||||||
|
);
|
||||||
|
|
||||||
|
let longest = test.longest().unwrap_or("collection is empty!");
|
||||||
|
println!("{longest}");
|
||||||
|
|
||||||
|
test.to_uppercase_all();
|
||||||
|
println!("{:?}", test);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct StringTool {
|
||||||
|
collection: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StringTool {
|
||||||
|
fn new() -> StringTool {
|
||||||
|
StringTool {
|
||||||
|
collection: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_string(&mut self, s: String) {
|
||||||
|
self.collection.push(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn longest(&self) -> Option<&str> {
|
||||||
|
if self.collection.len() < 1 {
|
||||||
|
return None;
|
||||||
|
} else {
|
||||||
|
let mut longest_string = &self.collection[0];
|
||||||
|
let mut length = longest_string.len();
|
||||||
|
let mut count = 0;
|
||||||
|
|
||||||
|
for v in &self.collection {
|
||||||
|
if v.len() > length {
|
||||||
|
longest_string = v;
|
||||||
|
length = longest_string.len();
|
||||||
|
}
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
Some(longest_string.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn to_uppercase_all(&mut self) {
|
||||||
|
for v in &mut self.collection {
|
||||||
|
*v = v.to_uppercase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//TODO improve search
|
||||||
|
fn contains_word(&self, word: &str) -> Vec<&str> {
|
||||||
|
let collection = &self.collection;
|
||||||
|
let mut return_val: Vec<&str> = Vec::new();
|
||||||
|
|
||||||
|
//for strings in collection
|
||||||
|
for v in collection {
|
||||||
|
let words: Vec<_> = v.split_ascii_whitespace().collect();
|
||||||
|
//for words in string
|
||||||
|
for w in words {
|
||||||
|
// for characters in word
|
||||||
|
|
||||||
|
if w == word {
|
||||||
|
return_val.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return_val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// fn word_count(&self) -> HashMap<String, usize> {
|
||||||
|
// // counts total occurences of each word
|
||||||
|
// }
|
||||||
30
exercises/string-manipulator/string-manipulator-exercise.md
Normal file
30
exercises/string-manipulator/string-manipulator-exercise.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Exercise: String Manipulator Tool
|
||||||
|
|
||||||
|
**Concepts practiced:** String vs &str, ownership/borrowing, Vec operations, pattern matching
|
||||||
|
**Objective:** Build a CLI tool that performs various string operations
|
||||||
|
|
||||||
|
## Requirements:
|
||||||
|
- Create a `StringTool` struct that holds a collection of strings
|
||||||
|
- Implement methods:
|
||||||
|
- `new()` - creates empty tool
|
||||||
|
- `add_string(&mut self, s: String)` - adds string to collection
|
||||||
|
- `longest(&self) -> Option<&str>` - returns longest string (or None if empty)
|
||||||
|
- `contains_word(&self, word: &str) -> Vec<&str>` - returns strings containing the word
|
||||||
|
- `to_uppercase_all(&mut self)` - converts all strings to uppercase in-place
|
||||||
|
|
||||||
|
## Success criteria:
|
||||||
|
- Code compiles without warnings
|
||||||
|
- Test with: adding "hello", "world", "rust programming"
|
||||||
|
- `longest()` should return "rust programming"
|
||||||
|
- `contains_word("o")` should return vec!["hello", "world", "rust programming"]
|
||||||
|
- After `to_uppercase_all()`, all strings should be uppercase
|
||||||
|
|
||||||
|
## Stretch goal:
|
||||||
|
Add a method `word_count(&self) -> HashMap<String, usize>` that counts total occurrences of each word across all strings
|
||||||
|
|
||||||
|
## Getting Started:
|
||||||
|
1. `cd exercises && cargo new string-manipulator`
|
||||||
|
2. Focus on ownership: when do you need `String` vs `&str`?
|
||||||
|
3. Think about borrowing: methods that read vs modify
|
||||||
|
|
||||||
|
Expected time: 45-60 minutes
|
||||||
Reference in New Issue
Block a user