Rust Implementation of Problem 43
View source code here on GitHub!
Problem Solution
- pub fn problems::p0043::p0043() -> utils::Answer
1/*
2Project Euler Problem 43
3
4This was pretty easy to do with zip()
5
6Revision 1:
7
8Roughly halve runtime by making a special case for 1, 2
9
10Problem:
11
12The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order,
13but it also has a rather interesting sub-string divisibility property.
14
15Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following:
16
17 d2d3d4=406 is divisible by 2
18 d3d4d5=063 is divisible by 3
19 d4d5d6=635 is divisible by 5
20 d5d6d7=357 is divisible by 7
21 d6d7d8=572 is divisible by 11
22 d7d8d9=728 is divisible by 13
23 d8d9d10=289 is divisible by 17
24
25Find the sum of all 0 to 9 pandigital numbers with this property.
26*/
27use itertools::Itertools;
28
29use crate::include::utils::Answer;
30
31pub fn p0043() -> Answer {
32 let mut answer: u64 = 0;
33 let divisibility: [u16; 6] = [3, 5, 7, 11, 13, 17];
34 for d in (0..10u16).permutations(10) {
35 if d[3] % 2 == 1{
36 continue;
37 }
38 let mut broken = false;
39 for ((&a, &b, &c), divisor) in d.iter().tuple_windows::<(_,_,_)>().skip(2).take(6).zip(divisibility) {
40 if (a * 100 + b * 10 + c) % divisor != 0 {
41 broken = true;
42 break;
43 }
44 }
45 if !broken {
46 answer += d.into_iter().fold(0u64, |acc, x| acc * 10 + x as u64);
47 }
48 }
49 return Answer::Int(answer.into());
50}