From 14b8764ee5ebd25b95f4bd2f641459fd03a8207a Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 18 Nov 2024 08:41:59 +0100 Subject: [PATCH] Run cargo fmt --- src/bin/problem_10.rs | 2 +- src/bin/problem_11.rs | 110 ++++++++++++++++++++++++++++++++---------- src/bin/problem_12.rs | 2 +- src/bin/problem_13.rs | 2 +- src/bin/problem_14.rs | 3 +- src/bin/problem_15.rs | 8 +-- src/bin/problem_16.rs | 1 - src/bin/problem_17.rs | 28 ++++++----- src/bin/problem_18.rs | 44 ++++++++--------- src/bin/problem_19.rs | 8 ++- src/bin/problem_20.rs | 4 +- src/bin/problem_21.rs | 2 +- src/bin/problem_22.rs | 38 +++++++++------ src/bin/problem_23.rs | 4 +- src/bin/problem_24.rs | 23 ++++++--- src/bin/problem_25.rs | 2 +- src/bin/problem_29.rs | 4 +- src/bin/problem_30.rs | 2 +- src/bin/problem_34.rs | 8 ++- src/bin/problem_50.rs | 4 +- src/bin/problem_67.rs | 19 +++----- src/bin/problem_9.rs | 8 +-- src/lib.rs | 90 +++++++++++++++++++++------------- 23 files changed, 258 insertions(+), 158 deletions(-) diff --git a/src/bin/problem_10.rs b/src/bin/problem_10.rs index 5b700b4..c3c4fb0 100644 --- a/src/bin/problem_10.rs +++ b/src/bin/problem_10.rs @@ -18,4 +18,4 @@ fn main() { } println!("{}", primes.iter().sum::()); -} \ No newline at end of file +} diff --git a/src/bin/problem_11.rs b/src/bin/problem_11.rs index 19deeff..4719642 100644 --- a/src/bin/problem_11.rs +++ b/src/bin/problem_11.rs @@ -1,38 +1,87 @@ fn main() { let grid = get_grid(); - let greatests = [find_h(grid.clone()), find_v(grid.clone()), find_diag_lr(grid.clone()), find_diag_rl(grid)]; + let greatests = [ + find_h(grid.clone()), + find_v(grid.clone()), + find_diag_lr(grid.clone()), + find_diag_rl(grid), + ]; println!("{}", greatests.iter().max().unwrap()); } fn get_grid() -> Vec> { vec![ - vec![08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08], - vec![49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00], - vec![81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65], - vec![52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91], - vec![22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80], - vec![24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50], - vec![32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70], - vec![67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21], - vec![24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72], - vec![21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95], - vec![78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92], - vec![16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57], - vec![86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58], - vec![19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40], - vec![04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66], - vec![88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69], - vec![04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36], - vec![20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16], - vec![20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54], - vec![01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48], + vec![ + 08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 08, + ], + vec![ + 49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00, + ], + vec![ + 81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65, + ], + vec![ + 52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 68, 56, 01, 32, 56, 71, 37, 02, 36, 91, + ], + vec![ + 22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80, + ], + vec![ + 24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50, + ], + vec![ + 32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70, + ], + vec![ + 67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 94, 39, 63, 08, 40, 91, 66, 49, 94, 21, + ], + vec![ + 24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72, + ], + vec![ + 21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95, + ], + vec![ + 78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 03, 80, 04, 62, 16, 14, 09, 53, 56, 92, + ], + vec![ + 16, 39, 05, 42, 96, 35, 31, 47, 55, 58, 88, 24, 00, 17, 54, 24, 36, 29, 85, 57, + ], + vec![ + 86, 56, 00, 48, 35, 71, 89, 07, 05, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58, + ], + vec![ + 19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 04, 89, 55, 40, + ], + vec![ + 04, 52, 08, 83, 97, 35, 99, 16, 07, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66, + ], + vec![ + 88, 36, 68, 87, 57, 62, 20, 72, 03, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69, + ], + vec![ + 04, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 08, 46, 29, 32, 40, 62, 76, 36, + ], + vec![ + 20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16, + ], + vec![ + 20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54, + ], + vec![ + 01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48, + ], ] } fn find_h(grid: Vec>) -> usize { let mut greatest = 0; for line in grid { - let greatest_in_line = line.windows(4).map(|nums| { nums.iter().product::() }).max().unwrap(); + let greatest_in_line = line + .windows(4) + .map(|nums| nums.iter().product::()) + .max() + .unwrap(); if greatest_in_line > greatest { greatest = greatest_in_line; } @@ -45,7 +94,10 @@ fn find_v(grid: Vec>) -> usize { let side_len = grid.len(); for line_quadruplets in grid.windows(4) { for idx in 0..side_len { - let prod = line_quadruplets[0][idx] * line_quadruplets[1][idx] * line_quadruplets[2][idx] * line_quadruplets[3][idx]; + let prod = line_quadruplets[0][idx] + * line_quadruplets[1][idx] + * line_quadruplets[2][idx] + * line_quadruplets[3][idx]; if prod > greatest { greatest = prod; } @@ -58,8 +110,11 @@ fn find_diag_lr(grid: Vec>) -> usize { let mut greatest = 0; let side_len = grid.len(); for line_quadruplets in grid.windows(4) { - for idx in 0..side_len-3 { - let prod = line_quadruplets[0][idx] * line_quadruplets[1][idx+1] * line_quadruplets[2][idx+2] * line_quadruplets[3][idx+3]; + for idx in 0..side_len - 3 { + let prod = line_quadruplets[0][idx] + * line_quadruplets[1][idx + 1] + * line_quadruplets[2][idx + 2] + * line_quadruplets[3][idx + 3]; if prod > greatest { greatest = prod; } @@ -73,7 +128,10 @@ fn find_diag_rl(grid: Vec>) -> usize { let side_len = grid.len(); for line_quadruplets in grid.windows(4) { for idx in 3..side_len { - let prod = line_quadruplets[0][idx] * line_quadruplets[1][idx-1] * line_quadruplets[2][idx-2] * line_quadruplets[3][idx-3]; + let prod = line_quadruplets[0][idx] + * line_quadruplets[1][idx - 1] + * line_quadruplets[2][idx - 2] + * line_quadruplets[3][idx - 3]; if prod > greatest { greatest = prod; } diff --git a/src/bin/problem_12.rs b/src/bin/problem_12.rs index 24a6c5b..709c60e 100644 --- a/src/bin/problem_12.rs +++ b/src/bin/problem_12.rs @@ -7,7 +7,7 @@ fn main() { println!("{triangular_num}"); break; } - n +=1; + n += 1; } } diff --git a/src/bin/problem_13.rs b/src/bin/problem_13.rs index 11bc891..4709c97 100644 --- a/src/bin/problem_13.rs +++ b/src/bin/problem_13.rs @@ -111,4 +111,4 @@ fn get_nums() -> Vec { Number::from("20849603980134001723930671666823555245252804609722"), Number::from("53503534226472524250874054075591789781264330331690"), ] -} \ No newline at end of file +} diff --git a/src/bin/problem_14.rs b/src/bin/problem_14.rs index b354d57..1b2f480 100644 --- a/src/bin/problem_14.rs +++ b/src/bin/problem_14.rs @@ -10,7 +10,7 @@ fn collatz_seq(start: usize) -> Vec { if curr == 1 { break; } - if curr % 2 == 0{ + if curr % 2 == 0 { curr /= 2; } else { curr = 3 * curr + 1; @@ -32,4 +32,3 @@ fn find_longest(max_start: usize) -> usize { biggest.0 } - diff --git a/src/bin/problem_15.rs b/src/bin/problem_15.rs index 0198420..fd403aa 100644 --- a/src/bin/problem_15.rs +++ b/src/bin/problem_15.rs @@ -3,8 +3,8 @@ use project_euler::number::Number; fn main() { let width = Number::from(20); let height = Number::from(20); - let a = (width.clone()+height.clone()).fact(); - let b = width.clone().fact()*height.clone().fact(); - let euler_15 = a/b; + let a = (width.clone() + height.clone()).fact(); + let b = width.clone().fact() * height.clone().fact(); + let euler_15 = a / b; println!("({width}+{height})!/{width}!*{height}!={euler_15}"); -} \ No newline at end of file +} diff --git a/src/bin/problem_16.rs b/src/bin/problem_16.rs index e2e9ba1..80b28cd 100644 --- a/src/bin/problem_16.rs +++ b/src/bin/problem_16.rs @@ -15,4 +15,3 @@ fn get_power(exp: usize) -> Number { } number } - diff --git a/src/bin/problem_17.rs b/src/bin/problem_17.rs index f8a3747..012ac4d 100644 --- a/src/bin/problem_17.rs +++ b/src/bin/problem_17.rs @@ -8,41 +8,40 @@ fn main() { println!("{num_letters}"); } - fn number_to_words(n: Number) -> String { let mut number_string = String::new(); let digits = n.clone().digits; for (pos, &digit) in digits.iter().enumerate() { if digits.len() > 1 && digits.len() - 2 == pos { if digit == 1 { - if digits[digits.len()-1] == 0 { + if digits[digits.len() - 1] == 0 { number_string.push_str("ten"); } - if digits[digits.len()-1] == 1 { + if digits[digits.len() - 1] == 1 { number_string.push_str("eleven"); } - if digits[digits.len()-1] == 2 { + if digits[digits.len() - 1] == 2 { number_string.push_str("twelve"); } - if digits[digits.len()-1] == 3 { + if digits[digits.len() - 1] == 3 { number_string.push_str("thirteen"); } - if digits[digits.len()-1] == 4 { + if digits[digits.len() - 1] == 4 { number_string.push_str("fourteen"); } - if digits[digits.len()-1] == 5 { + if digits[digits.len() - 1] == 5 { number_string.push_str("fifteen"); } - if digits[digits.len()-1] == 6 { + if digits[digits.len() - 1] == 6 { number_string.push_str("sixteen"); } - if digits[digits.len()-1] == 7 { + if digits[digits.len() - 1] == 7 { number_string.push_str("seventeen"); } - if digits[digits.len()-1] == 8 { + if digits[digits.len() - 1] == 8 { number_string.push_str("eighteen"); } - if digits[digits.len()-1] == 9 { + if digits[digits.len() - 1] == 9 { number_string.push_str("nineteen"); } } @@ -70,7 +69,10 @@ fn number_to_words(n: Number) -> String { if digit == 9 { number_string.push_str("ninety"); } - } else if digits.len() == 1 || (digits.len() - 2 != pos && !(digits.len() - 1 == pos && digits[digits.len() - 2] == 1)) { + } else if digits.len() == 1 + || (digits.len() - 2 != pos + && !(digits.len() - 1 == pos && digits[digits.len() - 2] == 1)) + { if digit == 1 { number_string.push_str("one"); } @@ -111,4 +113,4 @@ fn number_to_words(n: Number) -> String { } println!("{n}: {number_string}"); number_string -} \ No newline at end of file +} diff --git a/src/bin/problem_18.rs b/src/bin/problem_18.rs index e96e7e4..66273b0 100644 --- a/src/bin/problem_18.rs +++ b/src/bin/problem_18.rs @@ -6,21 +6,21 @@ fn main() { fn get_triangle() -> Vec> { vec![ - vec![75], - vec![95, 64], - vec![17, 47, 82], - vec![18, 35, 87, 10], - vec![20, 04, 82, 47, 65], - vec![19, 01, 23, 75, 03, 34], - vec![88, 02, 77, 73, 07, 63, 67], - vec![99, 65, 04, 28, 06, 16, 70, 92], - vec![41, 41, 26, 56, 83, 40, 80, 70, 33], - vec![41, 48, 72, 33, 47, 32, 37, 16, 94, 29], - vec![53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14], - vec![70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57], - vec![91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48], - vec![63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31], - vec![04, 62, 98, 27, 23, 09, 70, 98, 73, 93, 38, 53, 60, 04, 23], + vec![75], + vec![95, 64], + vec![17, 47, 82], + vec![18, 35, 87, 10], + vec![20, 04, 82, 47, 65], + vec![19, 01, 23, 75, 03, 34], + vec![88, 02, 77, 73, 07, 63, 67], + vec![99, 65, 04, 28, 06, 16, 70, 92], + vec![41, 41, 26, 56, 83, 40, 80, 70, 33], + vec![41, 48, 72, 33, 47, 32, 37, 16, 94, 29], + vec![53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14], + vec![70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57], + vec![91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48], + vec![63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31], + vec![04, 62, 98, 27, 23, 09, 70, 98, 73, 93, 38, 53, 60, 04, 23], ] } @@ -29,14 +29,14 @@ fn find_max_total(grid: Vec>) -> usize { let mut idx = triangle_height - 1; let mut highest_sums = match grid.get(idx) { Some(sums) => sums.to_vec(), - None => panic!("Impossible path: check grid") + None => panic!("Impossible path: check grid"), }; while idx > 0 { idx -= 1; let line = grid.get(idx).unwrap(); let mut new_highest_sums = Vec::new(); for (pos, &num) in line.iter().enumerate() { - new_highest_sums.push(max(num + highest_sums[pos], num + highest_sums[pos+1])) + new_highest_sums.push(max(num + highest_sums[pos], num + highest_sums[pos + 1])) } highest_sums = new_highest_sums; } @@ -49,13 +49,7 @@ mod test_18 { #[test] fn test_find_max_total() { - let grid = vec![ - vec![3], - vec![7, 4], - vec![2, 4, 6], - vec![8, 5, 9, 3], - ]; + let grid = vec![vec![3], vec![7, 4], vec![2, 4, 6], vec![8, 5, 9, 3]]; assert_eq!(23, find_max_total(grid)); } - -} \ No newline at end of file +} diff --git a/src/bin/problem_19.rs b/src/bin/problem_19.rs index f894256..a5c0f98 100644 --- a/src/bin/problem_19.rs +++ b/src/bin/problem_19.rs @@ -76,6 +76,10 @@ fn is_leap_year(year: usize) -> bool { fn get_last_day(year: usize, month: usize, first_day: Day) -> Day { let days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; let day_num = first_day.day_num_in_week(); - let days_in_month = if month == 1 && is_leap_year(year) { 29 } else { days_per_month[month] } + day_num; + let days_in_month = if month == 1 && is_leap_year(year) { + 29 + } else { + days_per_month[month] + } + day_num; Day::from_day_num((days_in_month - 1) % 7) -} \ No newline at end of file +} diff --git a/src/bin/problem_20.rs b/src/bin/problem_20.rs index c4a2bb1..90de773 100644 --- a/src/bin/problem_20.rs +++ b/src/bin/problem_20.rs @@ -2,7 +2,7 @@ use project_euler::number::Number; fn main() { let factorial = get_factorial(100); - dbg!(factorial.digits.iter().sum::()); + dbg!(factorial.digits.iter().sum::()); } fn get_factorial(factorial: isize) -> Number { @@ -14,4 +14,4 @@ fn get_factorial(factorial: isize) -> Number { number = number * n; } number -} \ No newline at end of file +} diff --git a/src/bin/problem_21.rs b/src/bin/problem_21.rs index 5a7282b..8c62888 100644 --- a/src/bin/problem_21.rs +++ b/src/bin/problem_21.rs @@ -40,4 +40,4 @@ fn get_divisors(n: isize) -> Vec { potential_divisor = potential_divisor + 1; } divisors.iter().map(|&divisor| divisor).collect() -} \ No newline at end of file +} diff --git a/src/bin/problem_22.rs b/src/bin/problem_22.rs index 5cc61db..b6cb411 100644 --- a/src/bin/problem_22.rs +++ b/src/bin/problem_22.rs @@ -7,24 +7,34 @@ fn main() { let mut sorted_names = vec![]; loop { let mut buffer = vec![]; - let num_bytes = reader.read_until(b',', &mut buffer).expect("could not read until"); + let num_bytes = reader + .read_until(b',', &mut buffer) + .expect("could not read until"); if num_bytes == 0 { break; } - match sorted_names.binary_search(&buffer[..buffer.len()-1].to_vec()) { + match sorted_names.binary_search(&buffer[..buffer.len() - 1].to_vec()) { Ok(_pos) => {} - Err(pos) => sorted_names.insert(pos, buffer[..buffer.len()-1].to_vec()) + Err(pos) => sorted_names.insert(pos, buffer[..buffer.len() - 1].to_vec()), } } - let score_total = sorted_names.iter().enumerate().map(|(pos, bytes)| { - bytes.iter().map(|&byte| { - // Don't count " in front and back of name, or in the case of Alonso, only front since it's been removed in the sorting stage for him - if byte != b'"' { - (byte - b'@') as usize - } else { - 0 - } - }).sum::() * (pos + 1) - }).sum::(); + let score_total = sorted_names + .iter() + .enumerate() + .map(|(pos, bytes)| { + bytes + .iter() + .map(|&byte| { + // Don't count " in front and back of name, or in the case of Alonso, only front since it's been removed in the sorting stage for him + if byte != b'"' { + (byte - b'@') as usize + } else { + 0 + } + }) + .sum::() + * (pos + 1) + }) + .sum::(); println!("\nscore: {score_total}"); -} \ No newline at end of file +} diff --git a/src/bin/problem_23.rs b/src/bin/problem_23.rs index e52adac..0d082c5 100644 --- a/src/bin/problem_23.rs +++ b/src/bin/problem_23.rs @@ -1,5 +1,5 @@ -use std::cmp::Ordering; use crate::NumberType::{Abundant, Deficient, Perfect}; +use std::cmp::Ordering; // 4179871 @@ -14,7 +14,7 @@ fn main() { } let mut contained = false; for abundant in &abundants { - match abundants.binary_search(&(num-abundant)) { + match abundants.binary_search(&(num - abundant)) { Ok(_) => { contained = true; break; diff --git a/src/bin/problem_24.rs b/src/bin/problem_24.rs index eccaa8c..cdc14ac 100644 --- a/src/bin/problem_24.rs +++ b/src/bin/problem_24.rs @@ -3,15 +3,24 @@ use std::error::Error; fn main() { let n = 1_000_000; let digits = vec![1, 0, 2, 3, 4, 5, 6, 7, 8, 9]; - let perm = permutation(digits, n).expect("Should return ok").iter().map(|&digit| digit.to_string()).collect::>().join(""); + let perm = permutation(digits, n) + .expect("Should return ok") + .iter() + .map(|&digit| digit.to_string()) + .collect::>() + .join(""); println!("{perm}"); let digits = vec!["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; //for n in 1..=factorial(digits.len()) { - let perm = permutation(digits.clone(), n).expect("Should return ok").join(""); - println!("{perm}"); + let perm = permutation(digits.clone(), n) + .expect("Should return ok") + .join(""); + println!("{perm}"); //} let digits = vec!["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]; - let perm = permutation(digits.clone(), n).expect("Should return ok").join(""); + let perm = permutation(digits.clone(), n) + .expect("Should return ok") + .join(""); println!("{perm}"); } @@ -39,8 +48,8 @@ fn permutation(mut digits: Vec, nth: usize) -> Result, let num_unique_digits = digits.len(); let mut remainder = nth - 1; for idx in 1..=digits.len() { - let permutations = remainder / factorial(num_unique_digits-idx); - remainder = remainder % factorial(num_unique_digits-idx); + let permutations = remainder / factorial(num_unique_digits - idx); + remainder = remainder % factorial(num_unique_digits - idx); perm.push(digits[permutations]); digits.remove(permutations); } @@ -54,4 +63,4 @@ fn factorial(num: usize) -> usize { fact = fact * n; } fact -} \ No newline at end of file +} diff --git a/src/bin/problem_25.rs b/src/bin/problem_25.rs index 5d37b40..28b84dd 100644 --- a/src/bin/problem_25.rs +++ b/src/bin/problem_25.rs @@ -65,4 +65,4 @@ fn find_fib(num_digits: usize) -> usize { } n += 1; } -} \ No newline at end of file +} diff --git a/src/bin/problem_29.rs b/src/bin/problem_29.rs index a754528..354fbdc 100644 --- a/src/bin/problem_29.rs +++ b/src/bin/problem_29.rs @@ -1,5 +1,5 @@ -use std::collections::HashSet; use project_euler::number::Number; +use std::collections::HashSet; fn main() { let mut terms: HashSet = HashSet::new(); @@ -11,4 +11,4 @@ fn main() { } } println!("{}", terms.len()); -} \ No newline at end of file +} diff --git a/src/bin/problem_30.rs b/src/bin/problem_30.rs index b129802..6d95907 100644 --- a/src/bin/problem_30.rs +++ b/src/bin/problem_30.rs @@ -25,4 +25,4 @@ fn nth_powers(nth: u32) -> isize { } } powers.iter().sum() -} \ No newline at end of file +} diff --git a/src/bin/problem_34.rs b/src/bin/problem_34.rs index d37154c..19898cf 100644 --- a/src/bin/problem_34.rs +++ b/src/bin/problem_34.rs @@ -26,10 +26,14 @@ fn digit_factorials() -> isize { idx += 1; } for n in 3..=max { - let digits_fact_sum = Number::from(n).digits.iter().map(|&digit| factorial(digit)).sum(); + let digits_fact_sum = Number::from(n) + .digits + .iter() + .map(|&digit| factorial(digit)) + .sum(); if n == digits_fact_sum { factorials.push(n); } } factorials.iter().sum() -} \ No newline at end of file +} diff --git a/src/bin/problem_50.rs b/src/bin/problem_50.rs index 5906fa9..46dc38d 100644 --- a/src/bin/problem_50.rs +++ b/src/bin/problem_50.rs @@ -26,7 +26,7 @@ fn solve() -> usize { for prime_window in primes.windows(chain_length) { let sum = prime_window.iter().map(|&prime| prime).sum::(); if primes.contains(&sum) { - return sum + return sum; } if sum > 1000000 { break; @@ -34,4 +34,4 @@ fn solve() -> usize { } chain_length -= 1; } -} \ No newline at end of file +} diff --git a/src/bin/problem_67.rs b/src/bin/problem_67.rs index f4c4d87..73d52f7 100644 --- a/src/bin/problem_67.rs +++ b/src/bin/problem_67.rs @@ -12,7 +12,10 @@ fn get_triangle() -> Vec> { let mut grid = Vec::new(); for line in reader.lines() { let line = line.expect("Could not get line"); - let nums = line.split_whitespace().map(|num| num.parse::().expect("Could not parse")).collect(); + let nums = line + .split_whitespace() + .map(|num| num.parse::().expect("Could not parse")) + .collect(); grid.push(nums); } grid @@ -23,14 +26,14 @@ fn find_max_total(grid: Vec>) -> usize { let mut idx = triangle_height - 1; let mut highest_sums = match grid.get(idx) { Some(sums) => sums.to_vec(), - None => panic!("Impossible path: check grid") + None => panic!("Impossible path: check grid"), }; while idx > 0 { idx -= 1; let line = grid.get(idx).unwrap(); let mut new_highest_sums = Vec::new(); for (pos, &num) in line.iter().enumerate() { - new_highest_sums.push(max(num + highest_sums[pos], num + highest_sums[pos+1])) + new_highest_sums.push(max(num + highest_sums[pos], num + highest_sums[pos + 1])) } highest_sums = new_highest_sums; } @@ -43,13 +46,7 @@ mod test_18 { #[test] fn test_find_max_total() { - let grid = vec![ - vec![3], - vec![7, 4], - vec![2, 4, 6], - vec![8, 5, 9, 3], - ]; + let grid = vec![vec![3], vec![7, 4], vec![2, 4, 6], vec![8, 5, 9, 3]]; assert_eq!(23, find_max_total(grid)); } - -} \ No newline at end of file +} diff --git a/src/bin/problem_9.rs b/src/bin/problem_9.rs index ab52e17..67ae407 100644 --- a/src/bin/problem_9.rs +++ b/src/bin/problem_9.rs @@ -2,7 +2,9 @@ fn main() { for a in 0..=1000 { for b in a..=(1000 - a) { let c = 1000 - (a + b); - if b == c { continue; } + if b == c { + continue; + } if is_triplet(a, b, c) { println!("a + b + c = {a} + {b} + {c} = {}", a + b + c); println!("abc = {}", a * b * c); @@ -12,5 +14,5 @@ fn main() { } fn is_triplet(a: usize, b: usize, c: usize) -> bool { - return a * a + b * b == c * c -} \ No newline at end of file + return a * a + b * b == c * c; +} diff --git a/src/lib.rs b/src/lib.rs index ed0108d..67eb8f6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ pub mod number { use std::cmp::{min, Ordering}; use std::fmt::{Display, Formatter}; use std::iter::zip; - use std::ops::{Add, Mul, Div, Sub, Rem}; + use std::ops::{Add, Div, Mul, Rem, Sub}; #[derive(Clone, Debug, Eq, PartialEq, Hash)] pub enum Sign { @@ -34,7 +34,11 @@ pub mod number { let mut digits_idx = digits_len - 1; loop { let digit_or_num = new_digits[digits_idx]; - let digit_len = if digit_or_num != 0 { (digit_or_num.abs() as f64 + 1.0).log10().ceil() as usize } else { 1 }; + let digit_len = if digit_or_num != 0 { + (digit_or_num.abs() as f64 + 1.0).log10().ceil() as usize + } else { + 1 + }; for i in 0..digit_len { let new_digit = Self::get_digit(digit_or_num, i); let (digit_idx, is_overflow) = digits_idx.overflowing_sub(i); @@ -68,12 +72,12 @@ pub mod number { } digits_len -= 1; new_digits.remove(0); - }, + } Ordering::Less => { self.sign = Sign::Negatif; break; - }, - _ => break + } + _ => break, }; } let mut digits_idx = digits_len - 1; @@ -82,7 +86,7 @@ pub mod number { if self.sign == Sign::Positif && digit < 0 && digits_idx > 0 { let mut_digit = new_digits.get_mut(digits_idx).unwrap(); *mut_digit = 10 - digit.abs(); - let mut_digit = new_digits.get_mut(digits_idx-1).unwrap(); + let mut_digit = new_digits.get_mut(digits_idx - 1).unwrap(); *mut_digit -= 1; } else { let mut_digit = new_digits.get_mut(digits_idx).unwrap(); @@ -95,8 +99,10 @@ pub mod number { } for digit in new_digits.clone() { match digit.cmp(&0) { - Ordering::Equal => {new_digits.remove(0);}, - _ => break + Ordering::Equal => { + new_digits.remove(0); + } + _ => break, }; } } @@ -141,7 +147,7 @@ pub mod number { let mut quotient = vec![]; let mut remainder = Number { digits: dividend.clone(), - sign: Sign::Positif + sign: Sign::Positif, }; let mut iteration = 1; loop { @@ -158,12 +164,12 @@ pub mod number { if n1_len == n2_len + iteration - 1 { break; } - remainder.digits.push(n1.digits[n2_len+iteration-1]); + remainder.digits.push(n1.digits[n2_len + iteration - 1]); iteration += 1; } let mut res = Number { digits: quotient, - sign: Sign::Positif + sign: Sign::Positif, }; res.handle_overflows(); for digit in res.clone().digits { @@ -194,7 +200,11 @@ pub mod number { impl From for String { fn from(value: Number) -> Self { - let string_vec: Vec = value.digits.iter().map(|&digit| digit.to_string()).collect(); + let string_vec: Vec = value + .digits + .iter() + .map(|&digit| digit.to_string()) + .collect(); string_vec.concat() } } @@ -211,10 +221,7 @@ pub mod number { let digit = Self::byte_to_digit(byte); digits.push(digit); } - Self { - digits, - sign - } + Self { digits, sign } } } @@ -224,23 +231,29 @@ pub mod number { if value < 0 { sign = Sign::Negatif; } - let num_len = if value > 0 { (value as f64 + 1.0).log10().ceil() as usize } else { 1 }; + let num_len = if value > 0 { + (value as f64 + 1.0).log10().ceil() as usize + } else { + 1 + }; let mut digits = vec![]; for digit_idx in 0..num_len { let digit = Self::get_digit(value, digit_idx); digits.push(digit); } - let digits = digits.iter().rev().map(|&digit| digit).collect(); - Self { - digits, - sign - } + let digits = digits.iter().rev().copied().collect(); + Self { digits, sign } } } impl Display for Number { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - let number_string = self.digits.iter().map(|&digit| { digit.to_string() }).collect::>().join(""); + let number_string = self + .digits + .iter() + .map(|&digit| digit.to_string()) + .collect::>() + .join(""); match self.sign { Sign::Positif => write!(f, "{number_string}"), Sign::Negatif => write!(f, "-{number_string}"), @@ -266,10 +279,12 @@ pub mod number { } } let zipped = zip(self_digits.iter(), rhs_digits.iter()); - let added = zipped.map(|(self_digit, rhs_digit)| { self_digit + rhs_digit }).collect(); + let added = zipped + .map(|(self_digit, rhs_digit)| self_digit + rhs_digit) + .collect(); let mut overflown_number = Self { digits: added, - sign: Sign::Positif + sign: Sign::Positif, }; overflown_number.handle_overflows(); overflown_number @@ -294,10 +309,12 @@ pub mod number { } } let zipped = zip(self_digits.iter(), rhs_digits.iter()); - let added = zipped.map(|(self_digit, rhs_digit)| { self_digit - rhs_digit }).collect(); + let added = zipped + .map(|(self_digit, rhs_digit)| self_digit - rhs_digit) + .collect(); let mut underflown_number = Self { digits: added, - sign: Sign::Positif + sign: Sign::Positif, }; underflown_number.handle_underflows(); underflown_number @@ -323,10 +340,10 @@ pub mod number { type Output = Number; fn mul(self, rhs: Number) -> Self::Output { - let multiplied = rhs.digits.iter().map(|digit| { digit * self }).collect(); + let multiplied = rhs.digits.iter().map(|digit| digit * self).collect(); let mut overflown_number = Number { digits: multiplied, - sign: Sign::Positif + sign: Sign::Positif, }; overflown_number.handle_overflows(); overflown_number @@ -337,10 +354,10 @@ pub mod number { type Output = Self; fn mul(self, rhs: isize) -> Self::Output { - let multiplied = self.digits.iter().map(|digit| { digit * rhs }).collect(); + let multiplied = self.digits.iter().map(|digit| digit * rhs).collect(); let mut overflown_number = Self { digits: multiplied, - sign: Sign::Positif + sign: Sign::Positif, }; overflown_number.handle_overflows(); overflown_number @@ -370,7 +387,13 @@ pub mod number { #[test] fn test_from_isize() { let number = Number::from(-1234); - assert_eq!(number, Number { digits: vec![1234], sign: Sign::Negatif }); + assert_eq!( + number, + Number { + digits: vec![1234], + sign: Sign::Negatif + } + ); } #[test] @@ -388,5 +411,4 @@ pub mod number { assert_eq!(digit_5, 1); } } - -} \ No newline at end of file +}