Skip to content

Instantly share code, notes, and snippets.

@davich
Created January 30, 2020 02:35
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 davich/c234a7d73e53fdf759fa6607f8bed6d3 to your computer and use it in GitHub Desktop.
Save davich/c234a7d73e53fdf759fa6607f8bed6d3 to your computer and use it in GitHub Desktop.
use std::collections::HashMap;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let ints = vec![1, 3, 5, 7, 8, 1];
assert_eq!(average(&ints), 4.166666666666667);
assert_eq!(median(&ints), 6.0);
assert_eq!(mode(&ints), 1);
}
}
fn main() {
let ints = vec![1,3,5,7,8,1];
println!("Average is {}", average(&ints));
println!("Median is {}", median(&ints));
println!("Mode is {}", mode(&ints));
println!("{:?}", ints);
}
fn average(ints : &[i32]) -> f64 {
assert!(!ints.is_empty(), "must not be empty");
ints.iter().sum::<i32>() as f64 / ints.len() as f64
}
fn median(ints : &[i32]) -> f64 {
assert!(!ints.is_empty(), "must not be empty");
let mut ints = ints.to_owned();
ints.sort();
match ints.len() % 2 {
0 => average(&vec![ints[(ints.len() / 2)], ints[(ints.len() / 2) + 1]]),
1 => ints[(ints.len() / 2)] as f64,
_ => unreachable!()
}
}
fn mode(ints: &[i32]) -> i32 {
assert!(!ints.is_empty(), "must not be empty");
let max = ints
.iter()
.fold(HashMap::new(), |mut acc, i| {
*acc.entry(i).or_insert(0) += 1;
acc
})
.into_iter()
.max_by_key(|&(_, count)| count);
match max {
Some((val, _)) => *val,
_ => -1,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment