diff --git a/src/euler200/src/main.rs b/src/euler200/src/main.rs index 2797ffa..5db16fe 100644 --- a/src/euler200/src/main.rs +++ b/src/euler200/src/main.rs @@ -13,7 +13,7 @@ fn main() { squbes.iterate(); squbes.iterate(); squbes.iterate(); - println!("{:?}", squbes.output()); + println!("{:?}", squbes.get_output()); } #[derive(Debug)] @@ -43,9 +43,14 @@ impl Squbes { self.calculate_squbes_with_current_prime(); self.save_current_prime(); self.update_current_prime(); + self.save_new_squbes(); } - pub fn output(&self) -> Vec { + fn save_new_squbes(&mut self) { + self.squbes.extend(self.new_squbes.drain(0..)); + } + + pub fn get_output(&self) -> Vec { let mut result: Vec<_> = self.squbes.iter().copied().collect(); result.sort_unstable(); result @@ -60,18 +65,7 @@ impl Squbes { } fn calculate_squbes_with_current_prime(&mut self) { - assert_ne!(self.current_prime, 0); - let iter = self - .used_primes - .iter() - .copied() - .zip([self.current_prime].into_iter().cycle()) - .chain( - [self.current_prime] - .into_iter() - .cycle() - .zip(self.used_primes.iter().copied()), - ) + let iter = get_iterator_over_pairs_both_ways(&self.used_primes, self.current_prime) .map(|(p, q)| Self::core(p, q)); self.new_squbes.extend(iter); } @@ -80,3 +74,14 @@ impl Squbes { p.pow(2) * q.pow(3) } } + +fn get_iterator_over_pairs_both_ways( + vec: &[u64], + value: u64, +) -> impl Iterator + '_ { + iterate_vec_and_scalar(vec, value).flat_map(|(x, y)| [(x, y), (y, x)].into_iter()) +} + +fn iterate_vec_and_scalar(vec: &[u64], value: u64) -> impl Iterator + '_ { + vec.iter().copied().zip([value].into_iter().cycle()) +}