PE 088 WIP, hard problem

This commit is contained in:
2023-04-16 21:21:18 +02:00
parent e7d501f936
commit a28244231a
3 changed files with 52 additions and 7 deletions

View File

@@ -2,6 +2,24 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "main" name = "main"
version = "0.1.0" version = "0.1.0"
dependencies = [
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
]

View File

@@ -6,3 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
num-traits = "0.2.15"

View File

@@ -1,15 +1,39 @@
use std::time::Instant; use num_traits::{identities::One, Num};
use std::{
cmp::min,
collections::{hash_map::RandomState, HashSet},
time::Instant,
};
fn product(v: &Vec<u32>) -> u32 { fn product<T: Num + Copy>(v: &Vec<T>) -> T {
v.iter().fold(1, |acc, &v_x| acc * v_x) v.iter().fold(One::one(), |acc, &v_x| acc * v_x)
} }
fn naive_solution(k: u32) -> u32 { fn naive_solution(k: u32) -> u32 {
todo!() let max_ps = 2 * k;
let mut numbers = vec![1; k as usize];
let mut result = u32::MAX;
let mut idx = k as usize - 1;
while numbers[0] <= k {
let p = product(&numbers);
let s = numbers.iter().sum::<u32>();
if p == s {
result = min(result, p);
return result;
} else if p > max_ps || s > max_ps {
idx -= 1;
} else {
numbers[idx] += 1;
}
}
return 0;
} }
// ChatGPT failing once again // ChatGPT failing once again
fn chatgpt_solution(k: u32) -> u32 { fn _chatgpt_solution(k: u32) -> u32 {
let mut prod = vec![2 * k; k as usize + 1]; let mut prod = vec![2 * k; k as usize + 1];
let mut sums = vec![2 * k; k as usize + 1]; let mut sums = vec![2 * k; k as usize + 1];
@@ -40,9 +64,11 @@ fn main() {
let now = Instant::now(); let now = Instant::now();
let max_k = 12; let max_k = 12;
let solution = naive_solution; let solution = naive_solution;
let result: u32 = (2..=max_k).into_iter().map(|k| solution(k)).sum();
let results: Vec<u32> = ((2..=max_k).into_iter().map(|k| solution(k))).collect();
let hash_results: HashSet<u32, RandomState> = HashSet::from_iter(results.into_iter());
let result: u32 = hash_results.into_iter().sum();
println!( println!(
"The sum of all minimal product-sum numbers for 2 <= k <= {} is: {}", "The sum of all minimal product-sum numbers for 2 <= k <= {} is: {}",