diff options
Diffstat (limited to 'challenge-192/roger-bell-west/rust/ch-2.rs')
| -rwxr-xr-x | challenge-192/roger-bell-west/rust/ch-2.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/challenge-192/roger-bell-west/rust/ch-2.rs b/challenge-192/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..7517d1f1aa --- /dev/null +++ b/challenge-192/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,56 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit + +use std::cmp::min; + +#[test] +fn test_ex1() { + assert_eq!(equaldistribution(vec![1, 0, 5]), 4); +} + +#[test] +fn test_ex2() { + assert_eq!(equaldistribution(vec![0, 2, 0]), -1); +} + +#[test] +fn test_ex3() { + assert_eq!(equaldistribution(vec![0, 3, 0]), 2); +} + +fn equaldistribution(list: Vec<isize>) -> isize { + let s = list.iter().sum::<isize>(); + let l = list.len() as isize; + if s % l != 0 { + return -1; + } + let m = s / l; + let mut out = 0; + let mut w = list.clone(); + loop { + for i in 0..w.len() - 1 { + if w[i] > m { + let v = w[i] - m; + w[i + 1] += v; + out += v; + w[i] = m; + } else if w[i] < m { + let v = min(m - w[i], w[i + 1]); + w[i + 1] -= v; + out += v; + w[i] += v; + } + } + let mut done = true; + for v in &w { + if *v != m { + done = false; + break; + } + } + if done { + break; + } + } + out +} |
