From a28244231a864ef22c1c18f7794d7756138d7319 Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Sun, 16 Apr 2023 21:21:18 +0200 Subject: [PATCH] PE 088 WIP, hard problem --- projecteuler/088/Cargo.lock | 18 ++++++++++++++++ projecteuler/088/Cargo.toml | 1 + projecteuler/088/src/main.rs | 40 +++++++++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/projecteuler/088/Cargo.lock b/projecteuler/088/Cargo.lock index 88ffcd8..b91cfc3 100644 --- a/projecteuler/088/Cargo.lock +++ b/projecteuler/088/Cargo.lock @@ -2,6 +2,24 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "main" 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", +] diff --git a/projecteuler/088/Cargo.toml b/projecteuler/088/Cargo.toml index fca4e93..ec5f990 100644 --- a/projecteuler/088/Cargo.toml +++ b/projecteuler/088/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +num-traits = "0.2.15" diff --git a/projecteuler/088/src/main.rs b/projecteuler/088/src/main.rs index 025be90..449598e 100644 --- a/projecteuler/088/src/main.rs +++ b/projecteuler/088/src/main.rs @@ -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 { - v.iter().fold(1, |acc, &v_x| acc * v_x) +fn product(v: &Vec) -> T { + v.iter().fold(One::one(), |acc, &v_x| acc * v_x) } 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::(); + + 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 -fn chatgpt_solution(k: u32) -> u32 { +fn _chatgpt_solution(k: u32) -> u32 { let mut prod = 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 max_k = 12; - let solution = naive_solution; - let result: u32 = (2..=max_k).into_iter().map(|k| solution(k)).sum(); + + let results: Vec = ((2..=max_k).into_iter().map(|k| solution(k))).collect(); + let hash_results: HashSet = HashSet::from_iter(results.into_iter()); + let result: u32 = hash_results.into_iter().sum(); println!( "The sum of all minimal product-sum numbers for 2 <= k <= {} is: {}",