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

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

    let diff = in_char as i32 - START_CHAR as i32;

    let delta: i32 = if diff < 0 { diff.neg() } else { diff };

    let shaft_len = delta / 5;
    let jizz_len = (delta - (shaft_len * 5)) / 3;
    let hands_cnt = delta - (shaft_len * 5) - (jizz_len * 3);

    let shaft = "=".repeat(shaft_len as usize);
    let jizz = "~".repeat(jizz_len as usize);
    let mr_hands = "w".repeat(hands_cnt as usize);
    let jizz_splash = "*".repeat(if diff < 0 { 1 } else { 0 } as usize);

    return format!("8{}{}D{}{}", shaft, mr_hands, jizz, jizz_splash);
}

pub fn enchode(str: String) -> std::string::String {
    str.trim()
        .chars()
        .map(enchode_letter)
        .collect::<Vec<String>>()
        .join(" ")
}

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

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

        assert_eq!(enchode(String::from("Beans Beans the magical fruit, the more you eat, the more you toot")), "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~");
    }
}