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
use std::ops::Neg;

fn chode_to_letter(in_chode: std::string::String) -> std::string::String {
    const START_CHAR: char = 'a';

    let shaft_len = in_chode.matches('=').count();
    let jizz_len = in_chode.matches('~').count();
    let hands_cnt = in_chode.matches('w').count();
    let jizz_splash_len = in_chode.matches('*').count();

    let diff = (shaft_len * 5) + (jizz_len * 3) + (hands_cnt);

    let delta: i32 = if jizz_splash_len == 1 {
        let int_return: i32 = diff as i32;

        int_return.neg()
    } else {
        diff as i32
    };

    let new_char: char = (START_CHAR as i32 + delta) as u8 as char;

    new_char.to_string()
}

pub fn dechode(str: String) -> std::string::String {
    str.trim()
        .split(' ')
        .map(|chode| chode_to_letter(chode.to_string()))
        .collect::<Vec<String>>()
        .join("")
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_dechode() {
        assert_eq!(
            dechode(String::from(
                "8=====D* 8wD~ 8==wD 8==wD 8==wD~ 8=============D* 8==D* 8==wD~ 8===wwD 8==wD 8D~"
            )),
            "Hello World"
        );

        assert_eq!(dechode(String::from("8======wD* 8wD~ 8D 8==D~ 8===D~ 8=============D* 8======wD* 8wD~ 8D 8==D~ 8===D~ 8=============D* 8===wD~ 8=wwD 8wD~ 8=============D* 8==wwD 8D 8=wD 8=D~ 8wwD 8D 8==wD 8=============D* 8=D 8===wwD 8====D 8=D~ 8===wD~ 8==========D~* 8=============D* 8===wD~ 8=wwD 8wD~ 8=============D* 8==wwD 8==wD~ 8===wwD 8wD~ 8=============D* 8====wD~ 8==wD~ 8====D 8=============D* 8wD~ 8D 8===wD~ 8==========D~* 8=============D* 8===wD~ 8=wwD 8wD~ 8=============D* 8==wwD 8==wD~ 8===wwD 8wD~ 8=============D* 8====wD~ 8==wD~ 8====D 8=============D* 8===wD~ 8==wD~ 8==wD~ 8===wD~")), "Beans Beans the magical fruit, the more you eat, the more you toot");
    }
}