feat(problem): 11 - largest product in a grid

This commit is contained in:
newt 2024-10-09 18:10:10 +01:00
parent 55a16a87a6
commit 8947bdd61c
3 changed files with 111 additions and 3 deletions

View file

@ -9,7 +9,7 @@ All of the solutions here are written in rust. [main.rs](src/main.rs) is the hom
## Challenge Completion
### <!-- completed -->10<!-- completed --> out of 100 public challenges completed.
### <!-- completed -->11<!-- completed --> out of 100 public challenges completed.
- [x] 1 - [Multiples of 3 or 5](src/bin/1.rs)
- [x] 2 - [Even Fibonacci numbers](src/bin/2.rs)
@ -21,7 +21,7 @@ All of the solutions here are written in rust. [main.rs](src/main.rs) is the hom
- [x] 8 - [Largest product in a series](src/bin/8.rs)
- [x] 9 - [Special Pythagorean triplet](src/bin/9.rs)
- [x] 10 - [Summation of primes](src/bin/10.rs)
- [ ] 11 - Largest product in a grid
- [x] 11 - [Largest product in a grid](src/bin/11.rs)
- [ ] 12 - Highly divisible triangular number
- [ ] 13 - Large sum
- [ ] 14 - Longest Collatz sequence

108
src/bin/11.rs Normal file
View file

@ -0,0 +1,108 @@
/*
Problem 11 - Largest product in a grid
In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?
*/
fn largest_grid_product(grid: Vec<Vec<usize>>, adjacent_digits: usize) -> usize {
let mut products: Vec<usize> = vec![];
for (i, row) in grid.iter().enumerate() {
for (j, _) in row.iter().enumerate() {
let horizontal = j < row.len() - adjacent_digits + 1;
let vertical = i < grid.len() - adjacent_digits + 1;
// Horizontal product
if horizontal {
let selection = &row[j..(j + adjacent_digits)];
products.push(selection.iter().product());
}
// Vertical product
if vertical {
let mut selection: Vec<usize> = vec![];
for k in 0..adjacent_digits {
selection.push(grid[i + k][j]);
}
products.push(selection.iter().product());
}
// Forward diagonal product
if vertical && horizontal {
let mut selection: Vec<usize> = vec![];
for k in 0..adjacent_digits {
selection.push(grid[i + k][j + k]);
}
products.push(selection.iter().product());
}
// Reverse diagonal product
if vertical && j > adjacent_digits - 2 {
let mut selection: Vec<usize> = vec![];
for k in 0..adjacent_digits {
selection.push(grid[i + k][j - k]);
}
products.push(selection.iter().product());
}
}
}
return *products.iter().max().unwrap();
}
fn main() {
let grid: Vec<Vec<usize>> = vec![
vec![8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8],
vec![49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0],
vec![81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65],
vec![52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 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, 3, 45, 2, 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, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21],
vec![24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72],
vec![21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95],
vec![78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92],
vec![16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57],
vec![86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58],
vec![19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40],
vec![4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66],
vec![88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69],
vec![4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 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, 4, 36, 16],
vec![20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54],
vec![1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]
];
let value = largest_grid_product(grid, 4);
println!("The largest product formed by four digits in the same direction in the given grid is {value}");
}

View file

@ -166,7 +166,7 @@ fn main() {{
drop(readme_file);
// Announce completion!
println!("{}", "File successfully created! Good luck (:".green());
println!("{}", "File successfully created! Good luck (:".green().bold());
Ok(())
}