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}

Tags: pandigital, divisibility