From b305da92d0fa31a7b81ef52e5754f499a098b401 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Wed, 28 Sep 2022 15:26:23 +0200 Subject: [PATCH] refactor 200 iterator --- lib/primes/src/lib.rs | 7 ++++++- src/euler200/src/main.rs | 27 ++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/primes/src/lib.rs b/lib/primes/src/lib.rs index dd5f505..040a978 100644 --- a/lib/primes/src/lib.rs +++ b/lib/primes/src/lib.rs @@ -6,12 +6,13 @@ use std::fs::File; use std::hash::Hash; use std::io::Write; use std::slice::Iter; +use std::vec::IntoIter; use num::FromPrimitive; use num::Num; use num::ToPrimitive; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Primes { vector: Vec, set: HashSet, @@ -110,6 +111,10 @@ where pub fn into_vec(self) -> Vec { self.vector } + + pub fn to_cloned_iter(&self) -> IntoIter { + self.vector.clone().into_iter() + } } #[cfg(test)] diff --git a/src/euler200/src/main.rs b/src/euler200/src/main.rs index 5db16fe..40f328b 100644 --- a/src/euler200/src/main.rs +++ b/src/euler200/src/main.rs @@ -19,35 +19,36 @@ fn main() { #[derive(Debug)] struct Squbes { squbes: HashSet, - new_squbes: Vec, - primes: IntoIter, + primes: Primes, + primes_iter: IntoIter, used_primes: Vec, current_prime: u64, } impl Squbes { pub fn new(max: u64) -> Self { - let mut primes = Primes::get_between(2, max).into_vec().into_iter(); - let first = primes.next().unwrap(); - let second = primes.next().unwrap(); + let primes = Primes::get_between(2, max); + let mut primes_iter = primes.to_cloned_iter(); + let first = primes_iter.next().unwrap(); + let second = primes_iter.next().unwrap(); Self { squbes: HashSet::new(), - new_squbes: vec![], primes, + primes_iter, used_primes: vec![first], current_prime: second, } } pub fn iterate(&mut self) { - self.calculate_squbes_with_current_prime(); + let squbes = self.calculate_squbes_with_current_prime(); self.save_current_prime(); self.update_current_prime(); self.save_new_squbes(); } fn save_new_squbes(&mut self) { - self.squbes.extend(self.new_squbes.drain(0..)); + todo!() } pub fn get_output(&self) -> Vec { @@ -61,13 +62,13 @@ impl Squbes { } fn update_current_prime(&mut self) { - self.current_prime = self.primes.next().unwrap(); + self.current_prime = self.primes_iter.next().unwrap(); } - fn calculate_squbes_with_current_prime(&mut self) { - 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); + fn calculate_squbes_with_current_prime(&mut self) -> Vec { + get_iterator_over_pairs_both_ways(&self.used_primes, self.current_prime) + .map(|(p, q)| Self::core(p, q)) + .collect() } fn core(p: u64, q: u64) -> u64 {