aboutsummaryrefslogtreecommitdiff
path: root/challenge-192/bruce-gray/rust/ch-2.rs
blob: 729c90d211803de78de89a3f97587e5ff32c1367 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Run with either of:
//      rustc --test rust/ch-2.rs && ./ch-2
//      rustc        rust/ch-2.rs && ./ch-2 3 6 3

fn task2 ( a : Vec<i32> ) -> i32 {
    let sum : i32 = a.iter().sum();
    let len : i32 = a.len() as i32;

    if sum % len != 0 {
        return -1;
    }

    let target = sum / len;

    // Raku code: (  [\+] ( @a X- target )  )».abs.sum
    return a.iter()
            .scan(0, |state, &x| { *state += x - target; Some(*state) })
            .map(|x| { x.abs() })
            .sum();
}

fn main () {
    let input : Vec<i32> = std::env::args()
        .skip(1)
        .map(|x| { x.parse::<i32>().unwrap() })
        .collect();

    assert!( !input.is_empty(), "Error: Need integer arguments on the command-line" );

    println!("task2({:?}) = {:?}", input.clone(), task2(input));
}

#[test]fn task_example_01() { assert_eq!(task2( vec![1, 0, 5] ),  4) }
#[test]fn task_example_02() { assert_eq!(task2( vec![0, 2, 0] ), -1) }
#[test]fn task_example_03() { assert_eq!(task2( vec![0, 3, 0] ),  2) }

#[test]fn test_misc_01()    { assert_eq!(task2( vec![4,0,0,0] ),  6) }
#[test]fn test_misc_02()    { assert_eq!(task2( vec![3,1,0,0] ),  5) }
#[test]fn test_misc_03()    { assert_eq!(task2( vec![3,0,1,0] ),  4) }
#[test]fn test_misc_04()    { assert_eq!(task2( vec![3,0,0,1] ),  3) }
#[test]fn test_misc_05()    { assert_eq!(task2( vec![2,2,0,0] ),  4) }
#[test]fn test_misc_06()    { assert_eq!(task2( vec![2,0,2,0] ),  2) }
#[test]fn test_misc_07()    { assert_eq!(task2( vec![2,0,0,2] ),  2) }
#[test]fn test_misc_08()    { assert_eq!(task2( vec![2,1,1,0] ),  3) }
#[test]fn test_misc_09()    { assert_eq!(task2( vec![2,1,0,1] ),  2) }
#[test]fn test_misc_10()    { assert_eq!(task2( vec![2,0,1,1] ),  1) }
#[test]fn test_misc_11()    { assert_eq!(task2( vec![1,1,1,1] ),  0) }
#[test]fn test_misc_12()    { assert_eq!(task2( vec![1,2,1,0] ),  2) }
#[test]fn test_misc_13()    { assert_eq!(task2( vec![1,2,0,1] ),  1) }
#[test]fn test_misc_14()    { assert_eq!(task2( vec![1,1,2,0] ),  1) }
#[test]fn test_misc_15()    { assert_eq!(task2( vec![1,1,0,2] ),  1) }

#[test]fn test_large_01() {
    let got = task2( vec![2 + (8*1000), 2, 2, 2, 2, 2, 2, 2] );
    let expected = 1000 * (1..(7+1)).sum::<i32>();
    assert_eq!(got, expected);
}
#[test]fn test_large_02() {
    let got = task2( vec![2, 2, 2, 2, 2, 2, 2, 2 + (8*1000)] );
    let expected = 1000 * (1..(7+1)).sum::<i32>();
    assert_eq!(got, expected);
}
#[test]fn test_large_03() {
    let got = task2( vec![2, 2, 2, 2, 2, 2, 2 + (8*1000), 2] );
    let expected = 1000 * (1+(1..(6+1)).sum::<i32>());
    assert_eq!(got, expected);
}

#[test]fn for_blog_post_01() {
    let got = task2( vec![6,3,3,3,3,0,3,3,3,3,0,1,3,3,3,6,5] );
    let expected = 15+15+10;
    assert_eq!(got, expected);
}