refactor 200 iterator

This commit is contained in:
Dr. Matthias Ratajczak
2022-09-28 15:26:23 +02:00
parent 4f9d64a987
commit b305da92d0
2 changed files with 20 additions and 14 deletions
+6 -1
View File
@@ -6,12 +6,13 @@ use std::fs::File;
use std::hash::Hash; use std::hash::Hash;
use std::io::Write; use std::io::Write;
use std::slice::Iter; use std::slice::Iter;
use std::vec::IntoIter;
use num::FromPrimitive; use num::FromPrimitive;
use num::Num; use num::Num;
use num::ToPrimitive; use num::ToPrimitive;
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct Primes<T> { pub struct Primes<T> {
vector: Vec<T>, vector: Vec<T>,
set: HashSet<T>, set: HashSet<T>,
@@ -110,6 +111,10 @@ where
pub fn into_vec(self) -> Vec<T> { pub fn into_vec(self) -> Vec<T> {
self.vector self.vector
} }
pub fn to_cloned_iter(&self) -> IntoIter<T> {
self.vector.clone().into_iter()
}
} }
#[cfg(test)] #[cfg(test)]
+14 -13
View File
@@ -19,35 +19,36 @@ fn main() {
#[derive(Debug)] #[derive(Debug)]
struct Squbes { struct Squbes {
squbes: HashSet<u64>, squbes: HashSet<u64>,
new_squbes: Vec<u64>, primes: Primes<u64>,
primes: IntoIter<u64>, primes_iter: IntoIter<u64>,
used_primes: Vec<u64>, used_primes: Vec<u64>,
current_prime: u64, current_prime: u64,
} }
impl Squbes { impl Squbes {
pub fn new(max: u64) -> Self { pub fn new(max: u64) -> Self {
let mut primes = Primes::get_between(2, max).into_vec().into_iter(); let primes = Primes::get_between(2, max);
let first = primes.next().unwrap(); let mut primes_iter = primes.to_cloned_iter();
let second = primes.next().unwrap(); let first = primes_iter.next().unwrap();
let second = primes_iter.next().unwrap();
Self { Self {
squbes: HashSet::new(), squbes: HashSet::new(),
new_squbes: vec![],
primes, primes,
primes_iter,
used_primes: vec![first], used_primes: vec![first],
current_prime: second, current_prime: second,
} }
} }
pub fn iterate(&mut self) { pub fn iterate(&mut self) {
self.calculate_squbes_with_current_prime(); let squbes = self.calculate_squbes_with_current_prime();
self.save_current_prime(); self.save_current_prime();
self.update_current_prime(); self.update_current_prime();
self.save_new_squbes(); self.save_new_squbes();
} }
fn save_new_squbes(&mut self) { fn save_new_squbes(&mut self) {
self.squbes.extend(self.new_squbes.drain(0..)); todo!()
} }
pub fn get_output(&self) -> Vec<u64> { pub fn get_output(&self) -> Vec<u64> {
@@ -61,13 +62,13 @@ impl Squbes {
} }
fn update_current_prime(&mut self) { 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) { fn calculate_squbes_with_current_prime(&mut self) -> Vec<u64> {
let iter = get_iterator_over_pairs_both_ways(&self.used_primes, self.current_prime) get_iterator_over_pairs_both_ways(&self.used_primes, self.current_prime)
.map(|(p, q)| Self::core(p, q)); .map(|(p, q)| Self::core(p, q))
self.new_squbes.extend(iter); .collect()
} }
fn core(p: u64, q: u64) -> u64 { fn core(p: u64, q: u64) -> u64 {