use crate::Solution;
use itertools::Itertools;
use pmath::digits::{digits, digits_to_int};
problem!(Problem0038, 38, "Pandigital Multiples");
impl Solution for Problem0038 {
fn solve(&self) -> String {
for perm in (1..=9).rev().permutations(9) {
for i in 1..=4 {
let mut digit_count = i;
let multiplicand: i32 = digits_to_int(perm[0..i].iter().rev(), 10);
let mut pandigital_multiple = true;
let mut n = 2;
while digit_count < 9 {
let next_product = multiplicand * n;
n += 1;
let next_digit_count = digit_count + digits(next_product, 10).len();
let next_product_digits: i32 =
digits_to_int(perm[digit_count..next_digit_count.min(9)].iter().rev(), 10);
if (next_digit_count > 9) || (next_product != next_product_digits) {
pandigital_multiple = false;
break;
}
digit_count = next_digit_count;
}
if pandigital_multiple {
let integer: i32 = digits_to_int(perm.iter().rev(), 10);
return integer.to_string();
}
}
}
panic!("No solution found.")
}
}