use crate::Solution;
use pmath::digits::digits;
use std::collections::{HashMap, HashSet};
problem!(Problem0062, 62, "Cubic Permutations");
impl Solution for Problem0062 {
fn solve(&self) -> String {
const PERM_COUNT: usize = 5;
let mut curr_num: u64 = 1;
let mut curr_cube = curr_num.pow(3);
let mut cubes = Vec::new();
for digits_count in 1.. {
cubes.clear();
let upper_bound = 10_u64.pow(digits_count);
while curr_cube < upper_bound {
cubes.push(curr_cube);
curr_num += 1;
curr_cube = curr_num.pow(3);
}
let mut cube_counts = HashMap::new();
for cube in &cubes {
let mut cube_digits = digits(*cube, 10).collect::<Vec<_>>();
cube_digits.sort();
cube_counts
.entry(cube_digits)
.and_modify(|e| *e += 1)
.or_insert(1);
}
let mut good_dig_seq = HashSet::new();
for (digits, count) in cube_counts {
if count == PERM_COUNT {
good_dig_seq.insert(digits);
}
}
for cube in &cubes {
let mut cube_digits = digits(*cube, 10).collect::<Vec<_>>();
cube_digits.sort();
if good_dig_seq.contains(&cube_digits) {
return cube.to_string();
}
}
}
unreachable!("Previous loop is infinite and can only be exited by returning.")
}
}