use crate::Solution;
use pmath::digits::digits;
problem!(Problem0092, 92, "Square Digit Chains");
impl Solution for Problem0092 {
fn solve(&self) -> String {
let mut cache: Vec<Option<bool>> = vec![None; LIMIT];
cache[1] = Some(false);
cache[89] = Some(true);
for i in 2..LIMIT {
if cache[i].is_none() {
cache[i] = Some(process_number(i as u64, &mut cache));
}
}
cache
.iter()
.filter(|&&x| x == Some(true))
.count()
.to_string()
}
}
const LIMIT: usize = 10_000_000;
fn process_number(num: u64, cache: &mut Vec<Option<bool>>) -> bool {
match num {
1 => false,
89 => true,
_ => {
let next = digits(num, 10).map(|x| (x as u64).pow(2)).sum();
if next as usize >= cache.len() {
process_number(next, cache)
} else {
match cache[next as usize] {
Some(true) => true,
Some(false) => false,
None => {
let result = process_number(next, cache);
cache[next as usize] = Some(result);
result
}
}
}
}
}
}