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

fn buddy_strings(source: &str, target: &str) -> bool {
    if source.len() != target.len() {
        return false;
    }
    let s: Vec<char> = source.chars().collect();
    let t: Vec<char> = target.chars().collect();
    let diffs: Vec<usize> = (0..s.len()).filter(|&i| s[i] != t[i]).collect();
    match diffs.len() {
        0 => s.len() != s.iter().collect::<std::collections::HashSet<_>>().len(),
        2 => s[diffs[0]] == t[diffs[1]] && s[diffs[1]] == t[diffs[0]],
        _ => false,
    }
}

#[test]
fn example() {
    assert_eq!(buddy_strings("fuck", "fcuk"), true);
    assert_eq!(buddy_strings("love", "love"), false);
    assert_eq!(buddy_strings("fodo", "food"), true);
    assert_eq!(buddy_strings("feed", "feed"), true);
}