From e896429b99c503e6c73eb7b9e77190f3ab6f02c4 Mon Sep 17 00:00:00 2001 From: Daniel Heras Quesada Date: Sun, 15 Dec 2024 12:16:06 +0100 Subject: [PATCH] day_10: basics done but counting all the possible trails --- assets/day_10_trail_map_input | 8 ++++ src/advent_of_code/mod.rs | 2 +- src/advent_of_code/tue_10.rs | 86 ++++++++++++++++++++++++++++++++++- src/advent_of_code/types.rs | 2 + src/advent_of_code/utils.rs | 17 +++++++ 5 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 assets/day_10_trail_map_input diff --git a/assets/day_10_trail_map_input b/assets/day_10_trail_map_input new file mode 100644 index 0000000..cada9b3 --- /dev/null +++ b/assets/day_10_trail_map_input @@ -0,0 +1,8 @@ +89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732 diff --git a/src/advent_of_code/mod.rs b/src/advent_of_code/mod.rs index 077c3c1..1b01b80 100644 --- a/src/advent_of_code/mod.rs +++ b/src/advent_of_code/mod.rs @@ -78,6 +78,6 @@ pub fn historian_hysteria() { // println!("The disk checksum is {}", disk_checksum); // Tuesday 10 - let trailhead_score = tue_10::hoof_it("."); + let trailhead_score = tue_10::hoof_it("./assets/day_10_trail_map_input"); println!("The trail head sum score is {}", trailhead_score); } diff --git a/src/advent_of_code/tue_10.rs b/src/advent_of_code/tue_10.rs index 2f4e72f..88bda03 100644 --- a/src/advent_of_code/tue_10.rs +++ b/src/advent_of_code/tue_10.rs @@ -1,5 +1,89 @@ +use utils::read_trail_map_input; + use super::*; pub fn hoof_it(input: &str) -> usize { - 0 + let trail_map = read_trail_map_input(input); + + let vector_of_scores = explore_map(trail_map); + + let mut sum_of_scores: usize = 0; + + println!("The score list is: {:?}", vector_of_scores); + // TODO: improve, this is dirty + for score in vector_of_scores { + sum_of_scores += score; + } + + sum_of_scores +} + +pub fn explore_map(map: TrailMap) -> Vec { + let mut trail_score_list: Vec = vec![]; + + for y_index in 0..map.len() { + for x_index in 0..map[y_index].len() { + if map[y_index][x_index] == 0 { + trail_score_list.push(explore_position(x_index, y_index, &map)); + } + } + } + + trail_score_list +} + +pub fn explore_position(x: TrailPosition, y: TrailPosition, map: &TrailMap) -> usize { + if map[y][x] == 9 { + return 1; + } + + let mut score_sum: usize = 0; + for next_position in get_pos_surroundings(x, y, map) { + if map[next_position.1][next_position.0] == map[y][x] + 1 { + score_sum += explore_position(next_position.0, next_position.1, map); + } + } + + score_sum +} + +pub fn get_pos_surroundings( + x: TrailPosition, + y: TrailPosition, + map: &TrailMap, +) -> Vec<(usize, usize)> { + let mut trail_pos_vec: Vec<(usize, usize)> = vec![]; + + if x > 0 { + trail_pos_vec.push((x - 1, y)); + + if y > 0 { + trail_pos_vec.push((x - 1, y - 1)); + } + if y < map.len() - 1 { + trail_pos_vec.push((x - 1, y + 1)); + } + } + + if x < map[0].len() - 1 { + trail_pos_vec.push((x + 1, y)); + + if y > 0 { + trail_pos_vec.push((x + 1, y - 1)); + } + + if y < map.len() - 1 { + trail_pos_vec.push((x + 1, y + 1)); + } + } + + if y > 0 { + trail_pos_vec.push((x, y - 1)); + } + + if y < map.len() - 1 { + trail_pos_vec.push((x, y + 1)); + } + + trail_pos_vec } diff --git a/src/advent_of_code/types.rs b/src/advent_of_code/types.rs index bb1d5a5..05b880a 100644 --- a/src/advent_of_code/types.rs +++ b/src/advent_of_code/types.rs @@ -79,3 +79,5 @@ pub type DiskChecksum = usize; // Hoof it pub type TrailScore = usize; +pub type TrailPosition = usize; +pub type TrailMap = Vec>; diff --git a/src/advent_of_code/utils.rs b/src/advent_of_code/utils.rs index 5e934bf..18ee48b 100644 --- a/src/advent_of_code/utils.rs +++ b/src/advent_of_code/utils.rs @@ -189,6 +189,23 @@ pub fn read_disk_map_input(input: &str) -> DiskMap { disk_map } +pub fn read_trail_map_input(input: &str) -> TrailMap { + let mut trail_map: TrailMap = vec![]; + + for line in read_to_string(input).unwrap().lines() { + let mut trail_row: Vec = vec![]; + for position in line.chars() { + if let Some(digit) = position.to_digit(10) { + trail_row.push(digit as usize); + } + } + + trail_map.push(trail_row); + } + + trail_map +} + pub fn calc_distance(num_1: T, num_2: T) -> T where T: PartialOrd + Sub,