solved 18 and 67
add .idea to .gitignore
This commit is contained in:
61
src/bin/problem_18.rs
Normal file
61
src/bin/problem_18.rs
Normal 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
55
src/bin/problem_67.rs
Normal 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));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user