use crate::Solution;
use itertools::Itertools;
use pmath::digits::{digits, digits_to_int};
use pmath::primes::sieve_of_eratosthenes;
use std::collections::BTreeSet;
problem!(Problem0049, 49, "Prime Permutations");
impl Solution for Problem0049 {
fn solve(&self) -> String {
let primes = sieve_of_eratosthenes(9999);
let mut primes_set = BTreeSet::new();
for prime in primes {
if prime > 999 {
primes_set.insert(prime);
}
}
let mut found_sequences = Vec::new();
let mut prime_perms = Vec::new();
'outer: while let Some(base_num) = primes_set.pop_first() {
prime_perms.clear();
prime_perms.push(base_num);
for perm in digits(base_num, 10).permutations(4) {
let perm_num = digits_to_int(perm, 10);
if primes_set.remove(&perm_num) {
prime_perms.push(perm_num);
}
}
prime_perms.sort_unstable();
for (n1, n2, n3) in prime_perms.iter().tuple_combinations() {
if n2 - n1 == n3 - n2 {
found_sequences.push([*n1, *n2, *n3]);
if found_sequences.len() == 2 {
break 'outer;
}
}
}
}
assert_eq!(
found_sequences.len(),
2,
"Found {} sequences, expected 2",
found_sequences.len()
);
let mut result = String::new();
for seq in found_sequences {
if !seq.contains(&1487) {
for num in seq {
result.push_str(&num.to_string());
}
}
}
result
}
}