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