/
main.rs
96 lines (79 loc) · 2.29 KB
/
main.rs
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
fn is_divisible(digits: &Vec<char>) -> bool {
let group_size = 2;
let max = digits.len() - group_size;
let primes = vec![2, 3, 5, 7, 11, 13, 17];
let mut i = 1;
loop {
let d = &digits[i..=i + group_size];
let n: u64 = d
.iter()
.collect::<String>()
.parse()
.unwrap();
if n % primes[i - 1] != 0 {
break false
}
i += 1;
if i >= max {
break true
}
}
}
#[test]
fn test_is_divisible() {
let g1 = vec!['1','4','0','6','3','5','7','2','8','9'];
let g2 = vec!['4','0','1','6','3','5','7','2','8','9'];
let g3 = vec!['4','0','1','7','3','5','6','2','8','9'];
assert_eq!(is_divisible(&g1), true);
assert_eq!(is_divisible(&g2), false);
assert_eq!(is_divisible(&g3), false)
}
fn fits_div_rule_2_and_5(digits: &Vec<char>) -> bool {
let rule_two = digits[3].to_digit(10).unwrap();
let rule_five = digits[5];
rule_two % 2 == 0 && (rule_five == '5' || rule_five == '0')
}
#[test]
fn test_fits_div_rule_2_and_5() {
let g1 = vec!['0','0','0','2','0','5','0','0','0','0'];
let g2 = vec!['0','0','0','3','0','5','0','0','0','0'];
let g3 = vec!['0','0','0','2','0','6','0','0','0','0'];
assert_eq!(fits_div_rule_2_and_5(&g1), true);
assert_eq!(fits_div_rule_2_and_5(&g2), false);
assert_eq!(fits_div_rule_2_and_5(&g3), false)
}
fn problem_43() -> u64 {
let mut sum: u64 = 0;
let mut digits = vec![
'9', '8', '7', '6', '5', '4', '3', '2', '1', '0'
];
let mut result: Vec<usize> = vec![0; digits.len()];
let mut i = 0;
while i < digits.len() {
if result[i] < i {
if i % 2 == 0 {
digits.swap(0, i);
} else {
digits.swap(result[i], i);
}
if fits_div_rule_2_and_5(&digits) && is_divisible(&digits) {
let n: u64 = digits
.iter()
.collect::<String>()
.parse()
.unwrap();
sum += n;
}
result[i] += 1;
i = 0;
} else {
result[i] = 0;
i += 1
}
}
sum
}
#[test]
fn test_problem_43() {
assert_eq!(problem_43(), 16695334890)
}