add 12 (WIP)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user