From f3bb67ee1e290852eedd4d6190735f5ca64ae3c3 Mon Sep 17 00:00:00 2001 From: timeshifter Date: Thu, 20 Mar 2025 10:43:52 +0100 Subject: [PATCH] 39 --- src/euler39/Cargo.toml | 9 +++++++++ src/euler39/src/lib.rs | 30 ++++++++++++++++++++++++++++++ src/euler39/src/main.rs | 29 +++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/euler39/Cargo.toml create mode 100644 src/euler39/src/lib.rs create mode 100644 src/euler39/src/main.rs diff --git a/src/euler39/Cargo.toml b/src/euler39/Cargo.toml new file mode 100644 index 0000000..c696341 --- /dev/null +++ b/src/euler39/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "euler39" +version = "0.1.0" +edition = "2024" + +[dependencies] + +[profile.release] +debug = true diff --git a/src/euler39/src/lib.rs b/src/euler39/src/lib.rs new file mode 100644 index 0000000..e9eb179 --- /dev/null +++ b/src/euler39/src/lib.rs @@ -0,0 +1,30 @@ +#[derive(Debug, Hash)] +pub struct Triangle { + a: usize, + b: usize, + c: usize, +} + +impl Triangle { + pub fn new(a: usize, b: usize, c: usize) -> Option { + Self { a, b, c }.sanity_check() + } + + fn sanity_check(self) -> Option { + if !self.sides_are_sufficiently_long() { + return None; + } + if !self.pythagoras_holds() { + return None; + } + Some(self) + } + + fn sides_are_sufficiently_long(&self) -> bool { + self.a + self.b > self.c || self.a + self.c > self.b || self.b + self.c > self.a + } + + fn pythagoras_holds(&self) -> bool { + self.a.pow(2) + self.b.pow(2) == self.c.pow(2) + } +} diff --git a/src/euler39/src/main.rs b/src/euler39/src/main.rs new file mode 100644 index 0000000..f48bfc6 --- /dev/null +++ b/src/euler39/src/main.rs @@ -0,0 +1,29 @@ +use std::collections::HashMap; + +use euler39::Triangle; + +fn main() { + let mut vec = vec![]; + for p in 2..=1_000_usize { + vec.push(0); + let current = vec.get_mut(p - 2).unwrap(); + for a in 2..=p { + let remainder = p - a; + let limit = remainder / 2; + for b in 1..limit { + let c = remainder - b; + if let Some(_triangle) = Triangle::new(a, b, c) { + *current += 1; + } + } + } + } + + let result = vec + .iter() + .enumerate() + .max_by_key(|(_, value)| **value) + .unwrap(); + + println!("{}: {}", result.0 + 2, result.1) +}