solved 18 and 67

add .idea to .gitignore
This commit is contained in:
2024-09-16 12:42:55 +02:00
parent 700e48d6c2
commit 8fb00273ca
4 changed files with 217 additions and 0 deletions

61
src/bin/problem_18.rs Normal file
View File

@@ -0,0 +1,61 @@
use std::cmp::max;
fn main() {
println!("{}", find_max_total(get_triangle()));
}
fn get_triangle() -> Vec<Vec<usize>> {
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],
]
}
fn find_max_total(grid: Vec<Vec<usize>>) -> usize {
let triangle_height = grid.len();
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")
};
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]))
}
highest_sums = new_highest_sums;
}
highest_sums[0]
}
#[cfg(test)]
mod test_18 {
use crate::find_max_total;
#[test]
fn test_find_max_total() {
let grid = vec![
vec![3],
vec![7, 4],
vec![2, 4, 6],
vec![8, 5, 9, 3],
];
assert_eq!(23, find_max_total(grid));
}
}

55
src/bin/problem_67.rs Normal file
View File

@@ -0,0 +1,55 @@
use std::cmp::max;
use std::fs::File;
use std::io::{BufRead, BufReader};
fn main() {
println!("{}", find_max_total(get_triangle()));
}
fn get_triangle() -> Vec<Vec<usize>> {
let file = File::open("triangle.txt").expect("Could not read file");
let reader = BufReader::new(file);
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::<usize>().expect("Could not parse")).collect();
grid.push(nums);
}
grid
}
fn find_max_total(grid: Vec<Vec<usize>>) -> usize {
let triangle_height = grid.len();
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")
};
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]))
}
highest_sums = new_highest_sums;
}
highest_sums[0]
}
#[cfg(test)]
mod test_18 {
use crate::find_max_total;
#[test]
fn test_find_max_total() {
let grid = vec![
vec![3],
vec![7, 4],
vec![2, 4, 6],
vec![8, 5, 9, 3],
];
assert_eq!(23, find_max_total(grid));
}
}