kaprekar/
lib.rs

1pub fn calculate_three(num: i32) -> Option<i32> {
2    if !(100..=999).contains(&num) {
3        None
4    } else if num == 495 {
5        Some(0)
6    } else {
7        parse_and_iterate(0, num, 3)
8    }
9}
10
11pub fn calculate_four(num: i32) -> Option<i32> {
12    if !(1000..=9999).contains(&num) {
13        None
14    } else if num == 6174 {
15        Some(0)
16    } else {
17        parse_and_iterate(0, num, 4)
18    }
19}
20
21pub fn parse_and_iterate(loop_counter: i32, number: i32, num_of_digits: i8) -> Option<i32> {
22    let int_to_str: String = number.to_string();
23    let mut char_vec: Vec<char> = int_to_str.chars().collect();
24    char_vec.sort_unstable(); // ascending vector
25    let mut reversed_vec = char_vec.to_vec();
26    reversed_vec.reverse(); // reverse is now the higher number
27
28    // turn vectors back into strings
29    let smaller_str = char_vec.iter().cloned().collect::<String>();
30    let rev_str = reversed_vec.iter().cloned().collect::<String>();
31
32    // strings to integers
33    let smaller_int: i32 = smaller_str.parse().unwrap();
34    let larger_int: i32 = rev_str.parse().unwrap();
35
36    // find difference between the two
37    let mut result = larger_int - smaller_int;
38
39    // make sure, if there are zeros in the number,
40    // they still get added to the end of the large number
41    // e.g. original: 1040 => small: 0014 => large: 4100
42    if num_of_digits == 3 {
43        if result < 10 {
44            result *= 100
45        } else if result < 100 {
46            result *= 10
47        }
48
49        if result == 495 {
50            Some(loop_counter + 1)
51        } else if result == 0 {
52            None
53        } else {
54            parse_and_iterate(loop_counter + 1, result, 3)
55        }
56    } else {
57        if result < 10 {
58            result *= 1000
59        } else if result < 100 {
60            result *= 100
61        } else if result < 1000 {
62            result *= 10
63        }
64
65        if result == 6174 {
66            Some(loop_counter + 1)
67        } else if result == 0 {
68            None
69        } else {
70            parse_and_iterate(loop_counter + 1, result, 4)
71        }
72    }
73}
74
75pub fn main() {
76    let answer_four = calculate_four(8811);
77    let answer_three = calculate_three(888);
78    println!("four-digit: {:#?}", answer_four);
79    println!("three-digit: {:#?}", answer_three);
80}