aboutsummaryrefslogtreecommitdiff
path: root/challenge-335/benjamin-andre/rust/ch-1.rs
blob: 4e2a470dc0445a777f6082ef5ba5c058d9712db8 (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
#!/bin/sh
//usr/bin/env rustc --test $0 -o kachow && ./kachow --nocapture; rm -f kachow ; exit

fn common_characters(words: &[&str]) -> Vec<char> {
    if words.is_empty() {
        return Vec::new();
    }
    let mut result = words[0].chars().collect::<Vec<_>>();
    for word in &words[1..] {
        let mut word_chars = word.chars().collect::<Vec<_>>();
        result.retain(|&c| {
            if let Some(pos) = word_chars.iter().position(|&x| x == c) {
                word_chars.remove(pos);
                true
            } else {
                false
            }
        });
    }
    result
}

#[test]
fn example() {
    assert_eq!(
        common_characters(&["bella", "label", "roller"]),
        vec!['e', 'l', 'l']
    );
    assert_eq!(common_characters(&["cool", "lock", "cook"]), vec!['c', 'o']);
    assert_eq!(
        common_characters(&["hello", "world", "pole"]),
        vec!['l', 'o']
    );
    assert_eq!(common_characters(&["abc", "def", "ghi"]), vec![]);
    assert_eq!(common_characters(&["aab", "aac", "aaa"]), vec!['a', 'a']);
}