47
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "euler47"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
itertools = "0.14.0"
|
||||
primes = { version = "*", path = "../../lib/primes" }
|
||||
|
||||
[dev-dependencies]
|
||||
rstest = "0.25.0"
|
||||
@@ -0,0 +1,76 @@
|
||||
use itertools::Itertools;
|
||||
use primes::Primes;
|
||||
|
||||
const MAX: usize = 1_000_000;
|
||||
|
||||
fn main() {
|
||||
let primes = Primes::get_between(2, MAX);
|
||||
|
||||
'outer: for number in 2..MAX {
|
||||
for i in 0..=3 {
|
||||
let factors = factorize_unique(number + i, &primes);
|
||||
if factors.len() != 4 {
|
||||
continue 'outer;
|
||||
}
|
||||
}
|
||||
println!("{number}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fn factorize(n: usize, primes: &Primes<usize>) -> Vec<usize> {
|
||||
if primes.contains(&n) {
|
||||
return vec![n];
|
||||
}
|
||||
|
||||
let mut remaining = n;
|
||||
let mut result = vec![];
|
||||
'outer: loop {
|
||||
if remaining == 1 {
|
||||
break 'outer;
|
||||
}
|
||||
'inner: for prime in primes.iter().take_while(|p| **p <= remaining) {
|
||||
let remainder = remaining % prime;
|
||||
if remainder == 0 {
|
||||
result.push(prime.to_owned());
|
||||
remaining /= prime;
|
||||
break 'inner;
|
||||
}
|
||||
}
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn factorize_unique(n: usize, primes: &Primes<usize>) -> Vec<usize> {
|
||||
factorize(n, primes).into_iter().unique().collect()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use primes::Primes;
|
||||
|
||||
use crate::{factorize, factorize_unique};
|
||||
|
||||
use rstest::rstest;
|
||||
|
||||
#[rstest]
|
||||
#[case(14, vec![2, 7])]
|
||||
#[case(15, vec![3, 5])]
|
||||
#[case(644, vec![2, 2, 7, 23])]
|
||||
#[case(645, vec![3, 5, 43])]
|
||||
#[case(646, vec![2, 17, 19])]
|
||||
fn factorization(#[case] input: usize, #[case] expected: Vec<usize>) {
|
||||
let primes = Primes::get_between(2, input);
|
||||
let result = factorize(input, &primes);
|
||||
assert_eq!(result, expected);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case(644, vec![2, 7, 23])]
|
||||
#[case(645, vec![3, 5, 43])]
|
||||
fn factorization_unique(#[case] input: usize, #[case] expected: Vec<usize>) {
|
||||
let primes = Primes::get_between(2, input);
|
||||
let result = factorize_unique(input, &primes);
|
||||
assert_eq!(result, expected);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user