add 12 (WIP)

This commit is contained in:
Dr. Matthias Ratajczak
2022-08-18 20:44:53 +02:00
parent 37f9c77f38
commit f8dcb4ba16
2 changed files with 92 additions and 0 deletions
+12
View File
@@ -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
+80
View File
@@ -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<Int, Vec<Int>>) -> HashSet<Int> {
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::Item> {
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);
}
}