Day 17b done

This commit is contained in:
Drew Galbraith 2023-12-19 10:12:20 -08:00
parent 00979e49cf
commit 4e51c57775
2 changed files with 43 additions and 45 deletions

View File

@ -1,6 +1,6 @@
use std::io; use std::io;
fn find_min_heat_loss(board: &Vec<Vec<u64>>) -> u64 { fn find_min_heat_loss(board: &Vec<Vec<u64>>, min_move: usize, max_move: usize) -> u64 {
let mut horiz_min: Vec<Vec<u64>> = Vec::new(); let mut horiz_min: Vec<Vec<u64>> = Vec::new();
let mut vert_min: Vec<Vec<u64>> = Vec::new(); let mut vert_min: Vec<Vec<u64>> = Vec::new();
@ -19,29 +19,28 @@ fn find_min_heat_loss(board: &Vec<Vec<u64>>) -> u64 {
for r in 0..board.len() { for r in 0..board.len() {
for c in 0..board[r].len() { for c in 0..board[r].len() {
let prev = horiz_min[r][c]; let prev = horiz_min[r][c];
// Check Backwards. // Check Backwards.
if c > 0 && vert_min[r][c - 1] != u64::MAX { let mut sum_back = 0;
horiz_min[r][c] = horiz_min[r][c].min(vert_min[r][c - 1] + board[r][c - 1]); let mut m = 1;
} while m <= max_move && c >= m {
if c > 1 && vert_min[r][c - 2] != u64::MAX { sum_back += board[r][c - m];
horiz_min[r][c] = if m >= min_move && vert_min[r][c - m] != u64::MAX {
horiz_min[r][c].min(vert_min[r][c - 2] + board[r][c - 1] + board[r][c - 2]); horiz_min[r][c] = horiz_min[r][c].min(vert_min[r][c - m] + sum_back);
} }
if c > 2 && vert_min[r][c - 3] != u64::MAX {
horiz_min[r][c] = horiz_min[r][c] m += 1;
.min(vert_min[r][c - 3] + board[r][c - 1] + board[r][c - 2] + board[r][c - 3]);
} }
// Check Forwards. // Check Forwards.
if c < board[r].len() - 1 && vert_min[r][c + 1] != u64::MAX { let mut sum_forwards = 0;
horiz_min[r][c] = horiz_min[r][c].min(vert_min[r][c + 1] + board[r][c + 1]); let mut m = 1;
} while m <= max_move && c + m < board[r].len() {
if c < board[r].len() - 2 && vert_min[r][c + 2] != u64::MAX { sum_forwards += board[r][c + m];
horiz_min[r][c] = if m >= min_move && vert_min[r][c + m] != u64::MAX {
horiz_min[r][c].min(vert_min[r][c + 2] + board[r][c + 1] + board[r][c + 2]); horiz_min[r][c] = horiz_min[r][c].min(vert_min[r][c + m] + sum_forwards);
} }
if c < board[r].len() - 3 && vert_min[r][c + 3] != u64::MAX { m += 1;
horiz_min[r][c] = horiz_min[r][c]
.min(vert_min[r][c + 3] + board[r][c + 1] + board[r][c + 2] + board[r][c + 3]);
} }
if horiz_min[r][c] != prev { if horiz_min[r][c] != prev {
@ -54,30 +53,28 @@ fn find_min_heat_loss(board: &Vec<Vec<u64>>) -> u64 {
for r in 0..board.len() { for r in 0..board.len() {
for c in 0..board[r].len() { for c in 0..board[r].len() {
let prev = vert_min[r][c]; let prev = vert_min[r][c];
// Check Backwards
if r > 0 && horiz_min[r - 1][c] != u64::MAX { // Check Backwards.
vert_min[r][c] = vert_min[r][c].min(horiz_min[r - 1][c] + board[r - 1][c]); let mut sum_back = 0;
} let mut m = 1;
if r > 1 && horiz_min[r - 2][c] != u64::MAX { while m <= max_move && r >= m {
vert_min[r][c] = sum_back += board[r - m][c];
vert_min[r][c].min(horiz_min[r - 2][c] + board[r - 1][c] + board[r - 2][c]); if m >= min_move && horiz_min[r - m][c] != u64::MAX {
} vert_min[r][c] = vert_min[r][c].min(horiz_min[r - m][c] + sum_back);
if r > 2 && horiz_min[r - 3][c] != u64::MAX { }
vert_min[r][c] = vert_min[r][c]
.min(horiz_min[r - 3][c] + board[r - 1][c] + board[r - 2][c] + board[r - 3][c]); m += 1;
} }
// Check Forwards. // Check Forwards.
if r < board.len() - 1 && horiz_min[r + 1][c] != u64::MAX { let mut sum_forwards = 0;
vert_min[r][c] = vert_min[r][c].min(horiz_min[r + 1][c] + board[r + 1][c]); let mut m = 1;
} while m <= max_move && r + m < board.len() {
if r < board.len() - 2 && horiz_min[r + 2][c] != u64::MAX { sum_forwards += board[r + m][c];
vert_min[r][c] = if m >= min_move && horiz_min[r + m][c] != u64::MAX {
vert_min[r][c].min(horiz_min[r + 2][c] + board[r + 1][c] + board[r + 2][c]); vert_min[r][c] = vert_min[r][c].min(horiz_min[r + m][c] + sum_forwards);
} }
if r < board.len() - 3 && horiz_min[r + 3][c] != u64::MAX { m += 1;
vert_min[r][c] = vert_min[r][c]
.min(horiz_min[r + 3][c] + board[r + 1][c] + board[r + 2][c] + board[r + 3][c]);
} }
if vert_min[r][c] != prev { if vert_min[r][c] != prev {
@ -94,7 +91,7 @@ fn find_min_heat_loss(board: &Vec<Vec<u64>>) -> u64 {
horiz_min[0][0].min(vert_min[0][0]) horiz_min[0][0].min(vert_min[0][0])
} }
pub fn min_heat_loss() -> u64 { pub fn min_heat_loss(min_move: usize, max_move: usize) -> u64 {
let mut buffer = String::new(); let mut buffer = String::new();
while io::stdin().read_line(&mut buffer).unwrap() > 0 {} while io::stdin().read_line(&mut buffer).unwrap() > 0 {}
@ -105,5 +102,5 @@ pub fn min_heat_loss() -> u64 {
.map(|s| s.chars().map(|c| (c as u64 - '0' as u64)).collect()) .map(|s| s.chars().map(|c| (c as u64 - '0' as u64)).collect())
.collect(); .collect();
find_min_heat_loss(&board) find_min_heat_loss(&board, min_move, max_move)
} }

View File

@ -57,7 +57,8 @@ fn main() {
"day15b" => println!("Sum: {}", day15::hash_map()), "day15b" => println!("Sum: {}", day15::hash_map()),
"day16a" => println!("Answer: {}", day16::solve()), "day16a" => println!("Answer: {}", day16::solve()),
"day16b" => println!("Answer: {}", day16::find_best()), "day16b" => println!("Answer: {}", day16::find_best()),
"day17a" => println!("Minimum: {}", day17::min_heat_loss()), "day17a" => println!("Minimum: {}", day17::min_heat_loss(1, 3)),
"day17b" => println!("Minimum: {}", day17::min_heat_loss(4, 10)),
_ => println!("Unrecognized day: {}", args[1]), _ => println!("Unrecognized day: {}", args[1]),
} }
} }