From 44a0b7f12f35949ac3b016c7ddfea15c7e835bc9 Mon Sep 17 00:00:00 2001 From: Olivia Appleton Date: Thu, 18 Jul 2024 00:02:03 -0500 Subject: [PATCH] Solve problems 8, 9 in rust --- docs/index.rst | 4 +-- docs/rust/p0008.rst | 13 ++++++++ docs/rust/p0009.rst | 13 ++++++++ rust/src/main.rs | 9 +++--- rust/src/p0008.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++ rust/src/p0009.rs | 32 ++++++++++++++++++++ 6 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 docs/rust/p0008.rst create mode 100644 docs/rust/p0009.rst create mode 100644 rust/src/p0008.rs create mode 100644 rust/src/p0009.rs diff --git a/docs/index.rst b/docs/index.rst index ef0065c8..0f03da63 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -110,9 +110,9 @@ This project is divided into several Makefiles, connected by a root Makefile whi +-----------+------+------+------+------+------+ |:prob:`7` | |d| | | | |d| | |d| | +-----------+------+------+------+------+------+ -|:prob:`8` | |d| | | | |d| | | +|:prob:`8` | |d| | | | |d| | |d| | +-----------+------+------+------+------+------+ -|:prob:`9` | |d| | | | |d| | | +|:prob:`9` | |d| | | | |d| | |d| | +-----------+------+------+------+------+------+ |:prob:`10` | |d| | | | |d| | |d| | +-----------+------+------+------+------+------+ diff --git a/docs/rust/p0008.rst b/docs/rust/p0008.rst new file mode 100644 index 00000000..73315191 --- /dev/null +++ b/docs/rust/p0008.rst @@ -0,0 +1,13 @@ +Rust Implementation of Problem 8 +================================ + +View source code `here on GitHub! `_ + +Problem Solution +---------------- + +.. rust:fn:: p0008::p0008() -> u64 + +.. literalinclude:: ../../rust/src/p0008.rs + :language: rust + :linenos: diff --git a/docs/rust/p0009.rst b/docs/rust/p0009.rst new file mode 100644 index 00000000..dbe0957e --- /dev/null +++ b/docs/rust/p0009.rst @@ -0,0 +1,13 @@ +Rust Implementation of Problem 9 +================================ + +View source code `here on GitHub! `_ + +Problem Solution +---------------- + +.. rust:fn:: p0009::p0009() -> u64 + +.. literalinclude:: ../../rust/src/p0009.rs + :language: rust + :linenos: diff --git a/rust/src/main.rs b/rust/src/main.rs index 03105e4a..dc92f6dc 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -9,15 +9,14 @@ use rstest::rstest; #[cfg(test)] use itertools::Itertools; -seq!(N in 0001..=0007 { +seq!(N in 0001..=0010 { mod p~N; }); -mod p0010; mod primes; type ProblemType = fn() -> u64; type ProblemRef<'a> = (&'a str, ProblemType, u64); -const ANSWERS: [ProblemRef; 8] = [ +const ANSWERS: [ProblemRef; 10] = [ ("p0001", p0001::p0001, 233168), ("p0002", p0002::p0002, 4613732), ("p0003", p0003::p0003, 6857), @@ -25,6 +24,8 @@ const ANSWERS: [ProblemRef; 8] = [ ("p0005", p0005::p0005, 232792560), ("p0006", p0006::p0006, 25164150), ("p0007", p0007::p0007, 104743), + ("p0008", p0008::p0008, 23514624000), + ("p0009", p0009::p0009, 31875000), ("p0010", p0010::p0010, 142913828922), ]; @@ -40,7 +41,7 @@ fn main() { } #[cfg(test)] -seq!(N in 0..8 { +seq!(N in 0..10 { #[rstest] #[timeout(Duration::new(60, 0))] #( diff --git a/rust/src/p0008.rs b/rust/src/p0008.rs new file mode 100644 index 00000000..5c02cdbe --- /dev/null +++ b/rust/src/p0008.rs @@ -0,0 +1,73 @@ +/* +Project Euler Problem 8 + +In Python I did this with an iterator, but that is more cumbersome here, +so I just did it with a loop that slices. + +Problem: + +The four adjacent digits in the 1000-digit number that have the greatest +product are 9 × 9 × 8 × 9 = 5832. + +73167176531330624919225119674426574742355349194934 +96983520312774506326239578318016984801869478851843 +85861560789112949495459501737958331952853208805511 +12540698747158523863050715693290963295227443043557 +66896648950445244523161731856403098711121722383113 +62229893423380308135336276614282806444486645238749 +30358907296290491560440772390713810515859307960866 +70172427121883998797908792274921901699720888093776 +65727333001053367881220235421809751254540594752243 +52584907711670556013604839586446706324415722155397 +53697817977846174064955149290862569321978468622482 +83972241375657056057490261407972968652414535100474 +82166370484403199890008895243450658541227588666881 +16427171479924442928230863465674813919123162824586 +17866458359124566529476545682848912883142607690042 +24219022671055626321111109370544217506941658960408 +07198403850962455444362981230987879927244284909188 +84580156166097919133875499200524063689912560717606 +05886116467109405077541002256983155200055935729725 +71636269561882670428252483600823257530420752963450 + +Find the thirteen adjacent digits in the 1000-digit number that have the +greatest product. What is the value of this product? +*/ + + +pub fn p0008() -> u64 { + let string = concat!( + "73167176531330624919225119674426574742355349194934", + "96983520312774506326239578318016984801869478851843", + "85861560789112949495459501737958331952853208805511", + "12540698747158523863050715693290963295227443043557", + "66896648950445244523161731856403098711121722383113", + "62229893423380308135336276614282806444486645238749", + "30358907296290491560440772390713810515859307960866", + "70172427121883998797908792274921901699720888093776", + "65727333001053367881220235421809751254540594752243", + "52584907711670556013604839586446706324415722155397", + "53697817977846174064955149290862569321978468622482", + "83972241375657056057490261407972968652414535100474", + "82166370484403199890008895243450658541227588666881", + "16427171479924442928230863465674813919123162824586", + "17866458359124566529476545682848912883142607690042", + "24219022671055626321111109370544217506941658960408", + "07198403850962455444362981230987879927244284909188", + "84580156166097919133875499200524063689912560717606", + "05886116467109405077541002256983155200055935729725", + "71636269561882670428252483600823257530420752963450" + ); + let mut answer: u64 = 0; + for i in 0..(string.len() - 13) { + let slice = &string[i..(i + 13)]; + let mut prod: u64 = 1; + for c in slice.bytes() { + prod *= (c - '0' as u8) as u64; + } + if prod > answer { + answer = prod; + } + } + return answer; +} diff --git a/rust/src/p0009.rs b/rust/src/p0009.rs new file mode 100644 index 00000000..514e2ae9 --- /dev/null +++ b/rust/src/p0009.rs @@ -0,0 +1,32 @@ +/* +Project Euler Problem 9 + + + +Problem: + +A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, +a**2 + b**2 = c**2 + +For example, 3**2 + 4**2 = 9 + 16 = 25 = 5**2. + +There exists exactly one Pythagorean triplet for which a + b + c = 1000. +Find the product abc. +*/ +const MAX = 500; + +pub fn p0009() -> u64 { + for c in 3..MAX { + let c_square = c * c; + for b in 2..c { + let b_square = b * b; + for a in 1..b { + let a_square = a * a; + if a_square + b_square == c_square && a + b + c == 1000 { + return a * b * c; + } + } + } + } + return 0; +}