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(); let mut reversed_vec = char_vec.to_vec();
26 reversed_vec.reverse(); let smaller_str = char_vec.iter().cloned().collect::<String>();
30 let rev_str = reversed_vec.iter().cloned().collect::<String>();
31
32 let smaller_int: i32 = smaller_str.parse().unwrap();
34 let larger_int: i32 = rev_str.parse().unwrap();
35
36 let mut result = larger_int - smaller_int;
38
39 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}