Skip to content

Instantly share code, notes, and snippets.

@wperron
Last active March 30, 2022 12:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wperron/279030f7bd8afbc3eadfc281fb6b6768 to your computer and use it in GitHub Desktop.
Save wperron/279030f7bd8afbc3eadfc281fb6b6768 to your computer and use it in GitHub Desktop.
Find elements in container within given bounds
fn main() {
println!(
"{:?}",
elements_in_container(String::from("|**|*|*|"), 0, 5)
);
println!(
"{:?}",
elements_in_container(String::from("|**|*|*|"), 0, 6)
);
println!(
"{:?}",
elements_in_container(String::from("|**|*|*|"), 1, 7)
);
println!(
"{:?}",
elements_in_container(String::from("**||**|*|***"), 1, 7)
);
println!(
"{:?}",
elements_in_container(String::from("************"), 1, 7)
);
println!("{:?}", elements_in_container(String::from("**|***"), 1, 5));
println!("{:?}", elements_in_container(String::from("|*****"), 1, 5));
println!("{:?}", elements_in_container(String::from("||****"), 1, 5));
println!("{:?}", elements_in_container(String::from("||||||"), 1, 5));
}
fn elements_in_container(s: String, from: usize, to: usize) -> Option<usize> {
if to < from {
return None;
}
if s.len() <= 1 {
return None;
}
let sub = &s[from..to];
let mut fwd = sub.char_indices();
let mut rev = sub.char_indices().rev();
let mut left = fwd.next().unwrap();
let mut right = rev.next().unwrap();
while left.1 != '|' || right.1 != '|' {
if left.1 != '|' {
match fwd.next() {
Some(n) => left = n,
None => return None,
}
}
if right.1 != '|' {
match rev.next() {
Some(n) => right = n,
None => return None,
}
}
if left.0 > right.0 {
return None;
}
}
let n = sub[left.0..right.0].chars().filter(|x| *x == '*').count();
if n == 0 {
return None;
}
Some(n)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment