From a9b0c0440b2f8bfd32cc922f3b5b2353fdf2cd3f Mon Sep 17 00:00:00 2001 From: timeshifter Date: Thu, 11 Aug 2022 11:25:52 +0200 Subject: [PATCH] add main loop for 51 (WIP) --- euler51/src/main.rs | 59 +++++++++++++++++++++++++++++++++++++++++-- euler51/src/primes.rs | 10 ++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/euler51/src/main.rs b/euler51/src/main.rs index db9ad47..9e035f2 100644 --- a/euler51/src/main.rs +++ b/euler51/src/main.rs @@ -4,11 +4,66 @@ use crate::primes::Primes; type Int = i64; -const MIN_VALUE: Int = 10_000_000; -const MAX_VALUE: Int = 10_010_000; +const MIN_VALUE: Int = 10_000; +const MAX_VALUE: Int = 99_999; + +const DIGITS: [Int; 10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; +// const MIN_VALUE: Int = 10_000_000; +// const MAX_VALUE: Int = 10_010_000; // const MAX_VALUE: Int = 99_999_999; fn main() { let primes = Primes::get_between(MIN_VALUE, MAX_VALUE); println!("{}", primes.vector[0]); + for p in primes.vector { + let mut candidates = vec![]; + let digits = num_to_digits(p); + for d in DIGITS { + let mut these_digits = digits.clone(); + these_digits[3] = d; + these_digits[4] = d; + let num = digits_to_num(these_digits); + if primes.set.contains(&num) { + candidates.push(num) + } + } + println!("candidates"); + for c in candidates { + println!("{c}"); + } + } +} + +fn num_to_digits(n: Int) -> Vec { + n.to_string() + .chars() + .map(|x| x.to_digit(10).unwrap() as Int) + .collect() +} + +fn digits_to_num(vec: Vec) -> Int { + let mut result = 0; + let mut position = 1; + for digit in vec.iter().rev() { + result += digit * position; + position *= 10; + } + result +} + +#[cfg(test)] +mod test { + use crate::{digits_to_num, num_to_digits}; + + #[test] + fn test_digits_to_num() { + let digits = vec![5, 7, 3, 8, 1]; + assert_eq!(digits_to_num(digits), 57381); + } + + #[test] + fn test_num_to_digits() { + let num = 83371; + assert_eq!(num_to_digits(num), vec![8, 3, 3, 7, 1]); + } } diff --git a/euler51/src/primes.rs b/euler51/src/primes.rs index de2b556..6bd5047 100644 --- a/euler51/src/primes.rs +++ b/euler51/src/primes.rs @@ -27,8 +27,9 @@ impl Primes let mut set = HashSet::new(); for number in *min_value..*max_value { if array[(number - min_value) as usize] { - vector.push(FromPrimitive::from_usize(number).unwrap()); - set.insert(FromPrimitive::from_usize(number).unwrap()); + let prime = FromPrimitive::from_usize(number).unwrap(); + vector.push(prime); + set.insert(prime); } } Primes { vector, set } @@ -56,4 +57,9 @@ impl Primes } result } + + pub fn remove(&mut self, num: T) { + let index = self.vector.iter().position(|x| x == &num).unwrap(); + self.vector.remove(index); + } }