add euler49 WIP
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "euler49"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
@@ -0,0 +1,87 @@
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
||||
type Int = i64;
|
||||
const MIN_VALUE: Int = 2;
|
||||
const MAX_VALUE: Int = 10_000;
|
||||
const SIZE: usize = (MAX_VALUE - MIN_VALUE) as usize;
|
||||
type Array = [bool; SIZE];
|
||||
|
||||
fn main() {
|
||||
println!("Getting prime numbers up to {}", MAX_VALUE);
|
||||
let primes = Primes::from_array(get_prime_numbers_array());
|
||||
println!("Starting to iterate ...");
|
||||
let result = find_using_iter(&primes);
|
||||
for item in result {
|
||||
println!("{item}");
|
||||
}
|
||||
}
|
||||
|
||||
fn get_prime_numbers_array() -> Array {
|
||||
// Sieve of Eratosthenes
|
||||
let mut result = [true; SIZE];
|
||||
for number_to_check in MIN_VALUE..(MAX_VALUE / 2) {
|
||||
let mut last_number = number_to_check;
|
||||
loop {
|
||||
let current_number = last_number + number_to_check;
|
||||
if current_number >= MAX_VALUE {
|
||||
break;
|
||||
}
|
||||
result[(current_number - MIN_VALUE) as usize] = false;
|
||||
last_number = current_number;
|
||||
}
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
struct Primes {
|
||||
vector: Vec<Int>,
|
||||
set: HashSet<Int>,
|
||||
}
|
||||
impl Primes {
|
||||
fn from_array(array: Array) -> Primes {
|
||||
let mut vector = Vec::new();
|
||||
let mut set = HashSet::new();
|
||||
for number in MIN_VALUE..MAX_VALUE {
|
||||
if array[(number - MIN_VALUE) as usize] {
|
||||
vector.push(number);
|
||||
set.insert(number);
|
||||
}
|
||||
}
|
||||
Primes { vector, set }
|
||||
}
|
||||
}
|
||||
|
||||
fn find_using_iter(primes: &Primes) -> [Int; 3] {
|
||||
for p1 in primes.vector.iter() {
|
||||
let p2 = p1 + 3330;
|
||||
let p3 = p2 + 3330;
|
||||
if primes.set.contains(&p2) && primes.set.contains(&p3) {
|
||||
let candidate = [*p1, p2, p3];
|
||||
if satisfies_checks(&candidate) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
}
|
||||
panic!()
|
||||
}
|
||||
|
||||
fn satisfies_checks(cand: &[Int; 3]) -> bool {
|
||||
cand.iter()
|
||||
.map(|x| get_amount_of_digits(x))
|
||||
.filter(|x, y| x == y)
|
||||
}
|
||||
|
||||
fn get_amount_of_digits(x: Int) -> HashMap<i32, usize> {
|
||||
let mut map = get_new_map();
|
||||
x.to_string()
|
||||
.chars()
|
||||
.map(|c| c.to_digit(10).unwrap() as i32)
|
||||
.for_each(|n| {
|
||||
map.insert(n, map.get(&n).unwrap() + 1).unwrap();
|
||||
});
|
||||
map
|
||||
}
|
||||
|
||||
fn get_new_map() -> HashMap<i32, usize> {
|
||||
(0..=9).into_iter().zip([0; 10]).collect()
|
||||
}
|
||||
Reference in New Issue
Block a user