diff --git a/README.md b/README.md index 996f755..52863a7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ https://adventofcode.com/2024 | 02 | Red-Nosed Reports | :pushpin: | :pushpin: | Bidirectional arrays | | 03 | Mull It Over | :pushpin: | :pushpin: | Regex | | 04 | Ceres Search | :pushpin: | :pushpin: | Matrix multidirectional search | -| 05 | Print Queue | :pushpin: | | Queue order | +| 05 | Print Queue | :pushpin: | :pushpin: | Queue order | | 06 | | | | | | 07 | | | | | | 08 | | | | | diff --git a/src/advent_of_code/mod.rs b/src/advent_of_code/mod.rs index 399b101..63b12f3 100644 --- a/src/advent_of_code/mod.rs +++ b/src/advent_of_code/mod.rs @@ -42,6 +42,8 @@ pub fn historian_hysteria() { println!("X-MAS appears {} times", x_mas_appearances); // Thursday 05 - let queue_mid_sum = thu_05::mid_queue_sum("./assets/day_5_rules_queue_input"); + let (queue_mid_sum, fixed_queue_mid_sum) = + thu_05::mid_queue_sum("./assets/day_5_rules_queue_input"); println!("The update mid-queue-sum is {}", queue_mid_sum); + println!("The fixed update mid-queue-sum is {}", fixed_queue_mid_sum); } diff --git a/src/advent_of_code/thu_05.rs b/src/advent_of_code/thu_05.rs index b4eb25d..710c5c0 100644 --- a/src/advent_of_code/thu_05.rs +++ b/src/advent_of_code/thu_05.rs @@ -2,24 +2,36 @@ use utils::read_rules_and_queue; use super::*; -pub fn mid_queue_sum(input: &str) -> u32 { +pub fn mid_queue_sum(input: &str) -> (u32, u32) { let (rules, queues) = read_rules_and_queue(input); let mut valid_queue_list: Vec = vec![]; + let mut invalid_queue_list: Vec = vec![]; + let mut fixed_queue_list: Vec = vec![]; let mut sum_of_mids: u32 = 0; + let mut sum_of_fixed_mids: u32 = 0; for queue in queues { if is_queue_valid(&queue, &rules) { valid_queue_list.push(queue); + } else { + invalid_queue_list.push(queue); } } + for mut queue in invalid_queue_list { + fixed_queue_list.push(fix_queue(&mut queue, &rules)) + } + for queue in valid_queue_list { sum_of_mids += queue[queue.len() / 2]; } + for queue in fixed_queue_list { + sum_of_fixed_mids += queue[queue.len() / 2]; + } - sum_of_mids + (sum_of_mids, sum_of_fixed_mids) } fn is_queue_valid(queue: &Queue, rules: &Vec) -> bool { @@ -35,6 +47,22 @@ fn is_queue_valid(queue: &Queue, rules: &Vec) -> bool { true } +fn fix_queue(queue: &mut Queue, rules: &Vec) -> Queue { + for _index in 0..queue.len() { + for rule in rules { + if let Ok(first_index) = get_index_of(queue, &rule.0) { + if let Ok(second_index) = get_index_of(queue, &rule.1) { + if first_index > second_index { + queue.swap(first_index, second_index); + } + } + } + } + } + + queue.to_vec() +} + fn get_index_of(vec: &Vec, element: &T) -> Result where T: PartialEq,