From f8dcb4ba16f3c34eb893d7d2c5ff78797609a73a Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 18 Aug 2022 20:44:53 +0200 Subject: [PATCH] add 12 (WIP) --- src/euler12/Cargo.toml | 12 +++++++ src/euler12/src/main.rs | 80 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/euler12/Cargo.toml create mode 100644 src/euler12/src/main.rs diff --git a/src/euler12/Cargo.toml b/src/euler12/Cargo.toml new file mode 100644 index 0000000..3d0a76a --- /dev/null +++ b/src/euler12/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "euler12" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[profile.release] +lto = true + diff --git a/src/euler12/src/main.rs b/src/euler12/src/main.rs new file mode 100644 index 0000000..aa2a16b --- /dev/null +++ b/src/euler12/src/main.rs @@ -0,0 +1,80 @@ +use std::collections::{HashMap, HashSet}; + +type Int = u64; + +fn main() { + let mut triangles = Triangle::new(); + let mut factors_dict = HashMap::from([(1, vec![1])]); + loop { + let tn = triangles.next().unwrap(); + print!("{tn}: "); + let factors = factorize(tn, &mut factors_dict); + if factors.len() > 500 { + println!("\n{tn}"); + break; + } else { + println!("{}", factors.len()); + } + } +} + +fn factorize(x: Int, dict: &mut HashMap>) -> HashSet { + let mut result = HashSet::from([x]); + let mut numbers_to_consider = HashSet::from([1..=(x / 2)]); + for i in .rev() { + if x % i == 0 { + result.insert(i); + } + } + // result.push(x); + result +} + +struct Triangle { + last_result: Int, + last_number: Int, +} + +impl Triangle { + fn new() -> Self { + Triangle { + last_result: 0, + last_number: 0, + } + } +} + +impl Iterator for Triangle { + type Item = Int; + + fn next(&mut self) -> Option { + self.last_number += 1; + self.last_result += self.last_number; + Some(self.last_result) + } +} + +#[cfg(test)] +mod test { + use crate::factorize; + use crate::Triangle; + + #[test] + + fn test_factorize() { + assert_eq!(factorize(6), vec![1, 2, 3, 6]); + assert_eq!(factorize(28), vec![1, 2, 4, 7, 14, 28]); + } + + #[test] + fn test_triangle() { + let mut t = Triangle::new(); + assert_eq!(t.next().unwrap(), 1); + assert_eq!(t.next().unwrap(), 3); + assert_eq!(t.next().unwrap(), 6); + assert_eq!(t.next().unwrap(), 10); + assert_eq!(t.next().unwrap(), 15); + assert_eq!(t.next().unwrap(), 21); + assert_eq!(t.next().unwrap(), 28); + } +}