apply small optimization and refactors (51)

This commit is contained in:
Dr. Matthias Ratajczak
2022-08-16 19:57:29 +02:00
parent 2f59e63dbf
commit 1357eb916d
+22 -13
View File
@@ -32,27 +32,29 @@ const DIGITS: [u8; 10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
fn main() { fn main() {
let all_primes = Primes::get_between(MIN_VALUE, MAX_VALUE); let all_primes = Primes::get_between(MIN_VALUE, MAX_VALUE);
let mut processed_cases = HashSet::new(); let mut processed_cases = HashSet::with_capacity(MIN_VALUE as usize);
let mut primes_matching_pattern = Vec::with_capacity(TARGET_LENGTH); let mut primes_matching_pattern = Vec::with_capacity(TARGET_LENGTH);
let mut case = String::with_capacity(LENGTH); let mut case_buf = String::with_capacity(LENGTH);
for pattern in PositionCombinations::new(MIN_LENGTH, MAX_LENGTH, LENGTH) { for pattern in PositionCombinations::new(MIN_LENGTH, MAX_LENGTH, LENGTH) {
for prime in &all_primes.vector { for prime in &all_primes.vector {
case.clear();
primes_matching_pattern.clear(); primes_matching_pattern.clear();
let digits = prime.to_digits(); let digits = prime.to_digits();
get_case_string(&digits, &pattern, &mut case); get_case_string(&digits, &pattern, &mut case_buf);
if processed_cases.contains(&case) { if processed_cases.contains(&case_buf) {
continue; continue;
} else { } else {
processed_cases.insert(case.clone()); processed_cases.insert(case_buf.clone());
} }
for digit in DIGITS { for (i, digit) in DIGITS.iter().enumerate() {
if !enough_digits_left(i, primes_matching_pattern.len()) {
break;
}
let could_be_prime = let could_be_prime =
replace_digits_with_new_digit_according_to_pattern(&digits, digit, &pattern); replace_digits_with_new_digit_according_to_pattern(&digits, *digit, &pattern);
if all_primes.contains(&could_be_prime) { if all_primes.contains(&could_be_prime) {
primes_matching_pattern.push(could_be_prime); primes_matching_pattern.push(could_be_prime);
} }
@@ -65,7 +67,13 @@ fn main() {
} }
} }
fn enough_digits_left(i: usize, primes_len: usize) -> bool {
// are there enough digits left in the loop to achieve the required TARGET_LENGTH?
i - primes_len + TARGET_LENGTH <= 10
}
fn get_case_string(digits: &[u8], pattern: &[bool], buf: &mut String) { fn get_case_string(digits: &[u8], pattern: &[bool], buf: &mut String) {
buf.clear();
digits digits
.iter() .iter()
.zip(pattern) .zip(pattern)
@@ -101,19 +109,20 @@ trait ToDigits {
fn to_digits(&self) -> Vec<u8>; fn to_digits(&self) -> Vec<u8>;
} }
#[allow(clippy::needless_range_loop)]
impl ToDigits for Int { impl ToDigits for Int {
fn to_digits(&self) -> Vec<u8> { fn to_digits(&self) -> Vec<u8> {
let oom = get_order_of_magnitude(*self); let oom = get_order_of_magnitude(*self);
let length = oom as usize; let length = oom as usize;
let mut var = *self; let mut var = *self;
let mut result = vec![0; length]; let mut result = vec![0; length];
for i in 0..length {
result.iter_mut().enumerate().for_each(|(i, d)| {
let power = 10_u64.pow(oom - i as u32 - 1); let power = 10_u64.pow(oom - i as u32 - 1);
let digit = var / power; let digit = var / power;
var -= (digit * power) as Int; var -= digit * power;
result[i] = digit as u8; *d = digit as u8;
} });
debug_assert_eq!(var, 0); debug_assert_eq!(var, 0);
result result
} }