pub fn burrows_wheeler_transform(input: String) -> (String, usize) { let len = input.len(); let mut table = Vec::::with_capacity(len); for i in 0..len { table.push(input[i..].to_owned() + &input[..i]); } table.sort_by_key(|a| a.to_lowercase()); let mut encoded = String::new(); let mut index: usize = 0; for (i, item) in table.iter().enumerate().take(len) { encoded.push(item.chars().last().unwrap()); if item.eq(&input) { index = i; } } (encoded, index) } pub fn inv_burrows_wheeler_transform(input: (String, usize)) -> String { let len = input.0.len(); let mut table = Vec::<(usize, char)>::with_capacity(len); for i in 0..len { table.push((i, input.0.chars().nth(i).unwrap())); } table.sort_by(|a, b| a.1.cmp(&b.1)); let mut decoded = String::new(); let mut idx = input.1; for _ in 0..len { decoded.push(table[idx].1); idx = table[idx].0; } decoded } #[cfg(test)] mod tests { use super::*; #[test] //Ensure function stand-alone legitimacy fn stand_alone_function() { assert_eq!( burrows_wheeler_transform("CARROT".to_string()), ("CTRRAO".to_string(), 1usize) ); assert_eq!( inv_burrows_wheeler_transform(("CTRRAO".to_string(), 1usize)), ("CARROT".to_string()) ); assert_eq!( burrows_wheeler_transform("THEALGORITHMS".to_string()), ("EHLTTRAHGOMSI".to_string(), 11usize) ); assert_eq!( inv_burrows_wheeler_transform(("EHLTTRAHGOMSI".to_string(), 11usize)), ("THEALGORITHMS".to_string()) ); assert_eq!( burrows_wheeler_transform("!.!.!??.=::".to_string()), (":..!!?:=.?!".to_string(), 0usize) ); assert_eq!( inv_burrows_wheeler_transform((":..!!?:=.?!".to_string(), 0usize)), "!.!.!??.=::" ); } #[test] fn basic_characters() { assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("CARROT".to_string())), "CARROT" ); assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("TOMATO".to_string())), "TOMATO" ); assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("THISISATEST".to_string())), "THISISATEST" ); assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("THEALGORITHMS".to_string())), "THEALGORITHMS" ); assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("RUST".to_string())), "RUST" ); } #[test] fn special_characters() { assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("!.!.!??.=::".to_string())), "!.!.!??.=::" ); assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform( "!{}{}(((&&%%!??.=::".to_string() )), "!{}{}(((&&%%!??.=::" ); assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("//&$[]".to_string())), "//&$[]" ); } #[test] fn empty() { assert_eq!( inv_burrows_wheeler_transform(burrows_wheeler_transform("".to_string())), "" ); } }