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");
}
}