Guest User

Untitled

a guest
Jul 19th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. #![deny(overflowing_literals, const_err)]
  2.  
  3. type Num = i32;
  4.  
  5. const LOW: Num = 1;
  6. const HIGH: Num = 1_000_000;
  7.  
  8. #[derive(Debug, PartialEq, Eq)]
  9. enum Argument {
  10. First,
  11. Second,
  12. }
  13.  
  14. #[derive(Debug, PartialEq, Eq)]
  15. enum SolveError {
  16. OutOfBound(Argument),
  17. IncorrectRelation,
  18. }
  19.  
  20. fn solve(a: Num, b: Num) -> Result<Num, SolveError> {
  21. const _ENSURE_NO_UNDERFLOW: Num = 2 * LOW - HIGH;
  22.  
  23. let check_arg = |arg, val| {
  24. if val < LOW || val >= HIGH {
  25. return Err(SolveError::OutOfBound(arg));
  26. }
  27. Ok(())
  28. };
  29.  
  30. check_arg(Argument::First, a)?;
  31. check_arg(Argument::Second, b)?;
  32.  
  33. if a > b {
  34. return Err(SolveError::IncorrectRelation);
  35. }
  36.  
  37. Ok(2 * a - b)
  38. }
  39.  
  40. fn median(a: Num, b: Num, c: Num) -> Num {
  41. let mut triple = [a, b, c];
  42. triple.sort();
  43. triple[1]
  44. }
  45.  
  46. fn avg(a: Num, b: Num, c: Num) -> Num {
  47. (a + b + c) / 3
  48. }
  49.  
  50. extern crate rand;
  51.  
  52. #[test]
  53. fn rand_tests() {
  54. use rand::distributions::{Distribution, Uniform};
  55.  
  56. let range = Uniform::from(LOW..HIGH);
  57. let mut rng = rand::thread_rng();
  58.  
  59. for _ in 0..80_000_000 {
  60. let (a, b) = (range.sample(&mut rng), range.sample(&mut rng));
  61. let (a, b) = if a < b { (a, b) } else { (b, a) };
  62.  
  63. let c = solve(a, b).unwrap();
  64. let (mid, avg) = (median(a, b, c), avg(a, b, c));
  65. assert_eq!(mid, avg,
  66. "\nArgs: {}, {}\nAnswer: {}\nMedian: {}\nAverage: {}\n",
  67. a, b, c, mid, avg);
  68. }
  69. }
Add Comment
Please, Sign In to add comment