use crate::Solution;
use std::collections::HashSet;
problem!(Problem0044, 44, "Pentagon Numbers");
impl Solution for Problem0044 {
fn solve(&self) -> String {
let mut sequence = vec![1, 5];
let mut curr_diff = 4;
let mut sequence_set = HashSet::new();
sequence_set.insert(1);
sequence_set.insert(5);
for curr_ind in 1.. {
let sum = sequence[curr_ind] + sequence[curr_ind - 1];
while sequence[sequence.len() - 1] < sum {
curr_diff += 3;
let next = sequence[sequence.len() - 1] + curr_diff;
sequence.push(next);
sequence_set.insert(next);
}
for i in (0..curr_ind).rev() {
if sequence_set.contains(&(sequence[curr_ind] - sequence[i]))
&& sequence_set.contains(&(sequence[curr_ind] + sequence[i]))
{
return (sequence[curr_ind] - sequence[i]).to_string();
}
}
}
unreachable!("Previous loop is infinite and can only be stopped by returning a value");
}
}