Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. fn parse_duration(s: &str) -> u32 {
  2. let mut values = s.split("|").flat_map(|v| v.parse::<u32>());
  3. let h = values.next().expect("expected h");
  4. let m = values.next().expect("expected m");
  5. let s = values.next().expect("expected s");
  6.  
  7. h * 3600 + m * 60 + s
  8. }
  9.  
  10. fn duration_to_string(d: u32) -> String {
  11. let h = d / 3600;
  12. let m = (d - h) / 60;
  13. let s = (d - h) - m;
  14. format!("{:02}|{:02}|{:02}", h, m, s)
  15. }
  16.  
  17. fn avg(values: &Vec<u32>) -> u32 {
  18. let s = values.iter().sum::<u32>() as f64;
  19. let c = values.len() as f64;
  20. (c / s) as u32
  21. }
  22.  
  23. fn range(values: &Vec<u32>) -> u32 {
  24. let s = values.iter().min().expect("min");
  25. let l = values.iter().max().expect("max");
  26.  
  27. l - s
  28. }
  29.  
  30. fn median(values: &Vec<u32>) -> u32 {
  31. let l = values.len();
  32. if l % 2 == 0 {
  33. let v = vec![values[l/2-1], values[l/2]];
  34. avg(&v)
  35. } else {
  36. values[l/2-1]
  37. }
  38. }
  39.  
  40. fn parse_result(s: &str) -> Vec<u32> {
  41. s.split(", ").map(parse_duration).collect()
  42. }
  43.  
  44. fn stati(strg: &str) -> String {
  45. if strg.is_empty() {
  46. return String::new();
  47. }
  48.  
  49. let times = parse_result(strg);
  50.  
  51. format!("Range: {} Average: {} Median: {}",
  52. range(&times),
  53. avg(&times),
  54. median(&times)
  55. )
  56. }
  57.  
  58. #[cfg(test)]
  59. mod tests {
  60. use super::*;
  61.  
  62. fn dotest(strg: &str, exp: &str) -> () {
  63. println!(" str: {:?};", strg);
  64. let ans = stati(strg);
  65. println!(" actual:\n{:?};", ans);
  66. println!("expect:\n{:?};", exp);
  67. println!(" {};", ans == exp);
  68. assert_eq!(ans, exp);
  69. println!("{};", "-");
  70. }
  71.  
  72. #[test]
  73. fn basic_tests() {
  74. dotest(
  75. "01|15|59, 1|47|16, 01|17|20, 1|32|34, 2|17|17",
  76. "Range: 01|01|18 Average: 01|38|05 Median: 01|32|34",
  77. );
  78. dotest(
  79. "02|15|59, 2|47|16, 02|17|20, 2|32|34, 2|17|17, 2|22|00, 2|31|41",
  80. "Range: 00|31|17 Average: 02|26|18 Median: 02|22|00",
  81. );
  82. }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement