Advertisement
Guest User

Rodinify

a guest
Sep 8th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.99 KB | None | 0 0
  1. use num_bigint::BigUint;
  2.  
  3. /// Convert a Unicode character to a number mapping {a-z} -> {1-26}
  4. fn char_to_int(character: char) -> Option<u8> {
  5.     if character.is_alphanumeric() && character.is_lowercase() {
  6.         Some(character as u8 - b'a' + 1)
  7.     } else {
  8.         None
  9.     }
  10. }
  11.  
  12. /// Convert a number to a character mapping {1-26} -> {a-z}
  13. fn int_to_char(integer: u8) -> Option<char> {
  14.     if integer >= 1 && integer <= 26 {
  15.         Some((integer - 1 + b'a').into())
  16.     } else {
  17.         None
  18.     }
  19. }
  20.  
  21. /// Rodinify the characters of a large number in single character mode
  22. fn rodinify_singlechar(input_string: &str) -> String {
  23.     input_string
  24.         .chars()
  25.         .filter_map(|x| x.to_digit(10))
  26.         .map(|x| x as u8)
  27.         .map(int_to_char)
  28.         .filter_map(|x| x)
  29.         .collect()
  30. }
  31.  
  32. /// Rodinify the characters of a large number in multi character mode
  33. fn rodinify_multichar(input_string: &str) -> String {
  34.     let mut output_string = String::new();
  35.     let mut digits = input_string
  36.         .chars()
  37.         .filter_map(|x| x.to_digit(10))
  38.         .map(|x| x as u8)
  39.         .skip_while(|x| int_to_char(*x).is_none());
  40.  
  41.     let mut last_digit = digits.next();
  42.  
  43.     for digit in digits {
  44.         if let Some(some_last_digit) = last_digit {
  45.             let combined_digits = (some_last_digit * 10) + digit;
  46.             if combined_digits <= 26 {
  47.                 if let Some(valid_character) = int_to_char(combined_digits) {
  48.                     output_string.push(valid_character);
  49.                 }
  50.                 last_digit = None;
  51.             } else {
  52.                 if let Some(valid_character) = int_to_char(some_last_digit) {
  53.                     output_string.push(valid_character);
  54.                 }
  55.                 last_digit = Some(digit);
  56.             }
  57.         } else {
  58.             last_digit = Some(digit);
  59.         }
  60.     }
  61.  
  62.     if let Some(last_digit) = last_digit.and_then(int_to_char) {
  63.         output_string.push(last_digit);
  64.     }
  65.  
  66.     output_string
  67. }
  68.  
  69. /// Map all characters {a-z} to the range {1-26} and multiply them from beginning to end
  70. fn multiply_character_numbers(input_string: &str) -> BigUint {
  71.     input_string
  72.         .chars()
  73.         .map(char_to_int)
  74.         .filter_map(|x| x)
  75.         .fold(BigUint::new(vec![1]), |x, val| x * val)
  76. }
  77.  
  78. /// Map all characters {a-z} to the range {1-26} and multiply them from beginning to end
  79. fn add_character_numbers(input_string: &str) -> BigUint {
  80.     input_string
  81.         .chars()
  82.         .map(char_to_int)
  83.         .filter_map(|x| x)
  84.         .fold(BigUint::new(vec![0]), |x, val| x + val)
  85. }
  86.  
  87. fn main() {
  88.     if let Some(input_str) = std::env::args().nth(1) {
  89.         let mul_string = multiply_character_numbers(&input_str.to_lowercase()).to_string();
  90.         let add_string = add_character_numbers(&input_str.to_lowercase()).to_string();
  91.         println!("Multiplying:");
  92.         println!("\tNumber: {}", mul_string);
  93.         println!("\tSingle: {}", rodinify_singlechar(&mul_string));
  94.         println!("\tMulti: {}", rodinify_multichar(&mul_string));
  95.         println!("Adding:");
  96.         println!("\tNumber: {}", add_string);
  97.         println!("\tSingle: {}", rodinify_singlechar(&add_string));
  98.         println!("\tMulti: {}", rodinify_multichar(&add_string));
  99.     }
  100. }
  101.  
  102. #[cfg(test)]
  103. mod tests {
  104.     use super::*;
  105.  
  106.     #[test]
  107.     fn test_char_to_int() {
  108.         assert_eq!(char_to_int('5'), None);
  109.         assert_eq!(char_to_int('A'), None);
  110.         assert_eq!(char_to_int('B'), None);
  111.         assert_eq!(char_to_int('`'), None);
  112.         assert_eq!(char_to_int('a'), Some(1));
  113.         assert_eq!(char_to_int('b'), Some(2));
  114.         assert_eq!(char_to_int('z'), Some(26));
  115.         assert_eq!(char_to_int('{'), None);
  116.     }
  117.  
  118.     #[test]
  119.     fn test_int_to_char() {
  120.         assert_eq!(int_to_char(0), None);
  121.         assert_eq!(int_to_char(1), Some('a'));
  122.         assert_eq!(int_to_char(2), Some('b'));
  123.         assert_eq!(int_to_char(25), Some('y'));
  124.         assert_eq!(int_to_char(26), Some('z'));
  125.         assert_eq!(int_to_char(27), None);
  126.     }
  127.  
  128.     #[test]
  129.     fn test_multiply_character_numbers() {
  130.         assert_eq!(
  131.             multiply_character_numbers("vvv pec"),
  132.             BigUint::new(vec![2555520])
  133.         );
  134.         assert_eq!(multiply_character_numbers("he"), BigUint::new(vec![40]));
  135.     }
  136.  
  137.     #[test]
  138.     fn test_add_character_numbers() {
  139.         assert_eq!(
  140.             add_character_numbers("big bara bois"),
  141.             BigUint::new(vec![85])
  142.         );
  143.     }
  144.  
  145.     #[test]
  146.     fn test_rodinify_single_char() {
  147.         let mul_string = multiply_character_numbers("vvv pec").to_string();
  148.         assert_eq!(rodinify_singlechar(&mul_string), String::from("beeeeb"));
  149.  
  150.         let add_string = add_character_numbers("big bara bois").to_string();
  151.         assert_eq!(rodinify_multichar(&add_string), String::from("he"));
  152.     }
  153.  
  154.     #[test]
  155.     fn test_rodinify_multi_char() {
  156.         let mul_string = multiply_character_numbers("vvv pec").to_string();
  157.         assert_eq!(rodinify_multichar(&mul_string), String::from("yeeet"));
  158.  
  159.         assert_eq!(rodinify_multichar("21212"), String::from("uub"));
  160.         assert_eq!(rodinify_multichar("20202"), String::from("ttb"));
  161.         assert_eq!(rodinify_multichar("2020"), String::from("tt"));
  162.         assert_eq!(rodinify_multichar("200"), String::from("t"));
  163.         assert_eq!(rodinify_multichar("0200"), String::from("t"));
  164.         assert_eq!(rodinify_multichar("0210"), String::from("u"));
  165.         assert_eq!(rodinify_multichar("02121212"), String::from("uuub"));
  166.         assert_eq!(rodinify_multichar("021021212"), String::from("ubll"));
  167.         assert_eq!(rodinify_multichar("0210212122"), String::from("ubllb"));
  168.  
  169.         let mul_string = multiply_character_numbers("she").to_string();
  170.         assert_eq!(rodinify_multichar(&mul_string), String::from("gf"));
  171.  
  172.         let mul_string = multiply_character_numbers("he").to_string();
  173.         assert_eq!(rodinify_multichar(&mul_string), String::from("d"));
  174.     }
  175.  
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement