From 5100bfea499a18e67d2cc862bd6529a4cf8d7dbb Mon Sep 17 00:00:00 2001 From: timeshifter Date: Wed, 28 Sep 2022 01:11:27 +0200 Subject: [PATCH] add 200 (WIP) --- lib/primes/src/lib.rs | 4 ++ src/euler200/Cargo.toml | 9 +++++ src/euler200/src/main.rs | 82 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 src/euler200/Cargo.toml create mode 100644 src/euler200/src/main.rs diff --git a/lib/primes/src/lib.rs b/lib/primes/src/lib.rs index 3b2de7a..dd5f505 100644 --- a/lib/primes/src/lib.rs +++ b/lib/primes/src/lib.rs @@ -106,6 +106,10 @@ where pub fn iter(&self) -> Iter { self.vector.iter() } + + pub fn into_vec(self) -> Vec { + self.vector + } } #[cfg(test)] diff --git a/src/euler200/Cargo.toml b/src/euler200/Cargo.toml new file mode 100644 index 0000000..eb1024a --- /dev/null +++ b/src/euler200/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "euler200" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +primes = {version = "*", path = "../../lib/primes"} diff --git a/src/euler200/src/main.rs b/src/euler200/src/main.rs new file mode 100644 index 0000000..2797ffa --- /dev/null +++ b/src/euler200/src/main.rs @@ -0,0 +1,82 @@ +extern crate primes; +use primes::Primes; +use std::{collections::HashSet, vec::IntoIter}; + +#[cfg(debug_assertions)] +const MAX_VALUE: u64 = 100; + +#[cfg(not(debug_assertions))] +const MAX_VALUE: u64 = 10_000_000; + +fn main() { + let mut squbes = Squbes::new(MAX_VALUE); + squbes.iterate(); + squbes.iterate(); + squbes.iterate(); + println!("{:?}", squbes.output()); +} + +#[derive(Debug)] +struct Squbes { + squbes: HashSet, + new_squbes: Vec, + primes: 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(); + Self { + squbes: HashSet::new(), + new_squbes: vec![], + primes, + used_primes: vec![first], + current_prime: second, + } + } + + pub fn iterate(&mut self) { + self.calculate_squbes_with_current_prime(); + self.save_current_prime(); + self.update_current_prime(); + } + + pub fn output(&self) -> Vec { + let mut result: Vec<_> = self.squbes.iter().copied().collect(); + result.sort_unstable(); + result + } + + fn save_current_prime(&mut self) { + self.used_primes.push(self.current_prime); + } + + fn update_current_prime(&mut self) { + self.current_prime = self.primes.next().unwrap(); + } + + 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()), + ) + .map(|(p, q)| Self::core(p, q)); + self.new_squbes.extend(iter); + } + + fn core(p: u64, q: u64) -> u64 { + p.pow(2) * q.pow(3) + } +}