diff --git a/src/advent_of_code/sun_01.rs b/src/advent_of_code/day_01.rs similarity index 82% rename from src/advent_of_code/sun_01.rs rename to src/advent_of_code/day_01.rs index 7bd755e..360b3ac 100644 --- a/src/advent_of_code/sun_01.rs +++ b/src/advent_of_code/day_01.rs @@ -1,5 +1,12 @@ use super::*; +pub fn today() { + let key = get_key("./assets/day_1_input").unwrap(); + println!("The key is: {key}"); + let similarity = get_similarity("./assets/day_1_input"); + println!("The similarity is: {similarity}"); +} + pub fn get_key(input: &str) -> Result { let mut key: Id = 0; diff --git a/src/advent_of_code/mon_02.rs b/src/advent_of_code/day_02.rs similarity index 92% rename from src/advent_of_code/mon_02.rs rename to src/advent_of_code/day_02.rs index 33a927d..88c0143 100644 --- a/src/advent_of_code/mon_02.rs +++ b/src/advent_of_code/day_02.rs @@ -2,6 +2,11 @@ use utils::{calc_distance, read_report_list}; use super::*; +pub fn today() { + let safe_report_count = check_reports_safety("./assets/day_2_reports_input"); + println!("There are {safe_report_count} safe reports"); +} + pub fn check_reports_safety(input: &str) -> ReportSafety { let report_list = read_report_list(input); diff --git a/src/advent_of_code/tue_03.rs b/src/advent_of_code/day_03.rs similarity index 86% rename from src/advent_of_code/tue_03.rs rename to src/advent_of_code/day_03.rs index f27718d..fbe5474 100644 --- a/src/advent_of_code/tue_03.rs +++ b/src/advent_of_code/day_03.rs @@ -3,6 +3,20 @@ use utils::read_instruction_input; use super::*; +pub fn today() { + let multiplication_added_result = mull_it_over("./assets/day_3_instruction_input"); + println!( + "The result of the sum of multiplications is {}", + multiplication_added_result + ); + let conditional_multiplication_added_result = + mull_it_over_conditional("./assets/day_3_instruction_input"); + println!( + "The result of the conditional sum of multiplications is {}", + conditional_multiplication_added_result + ); +} + pub fn mull_it_over(input: &str) -> MulNumber { let instruction_input = read_instruction_input(input); diff --git a/src/advent_of_code/wed_04.rs b/src/advent_of_code/day_04.rs similarity index 95% rename from src/advent_of_code/wed_04.rs rename to src/advent_of_code/day_04.rs index c311a32..ac9f73b 100644 --- a/src/advent_of_code/wed_04.rs +++ b/src/advent_of_code/day_04.rs @@ -5,6 +5,12 @@ use super::*; const SEARCHED_WORD: &str = "XMAS"; const X_SEARCHED_WORD: &str = "MAS"; +pub fn today() { + let (xmas_appearances, x_mas_appearances) = ceres_search("./assets/day_4_input"); + println!("XMAS appears {} times", xmas_appearances); + println!("X-MAS appears {} times", x_mas_appearances); +} + pub fn ceres_search(input: &str) -> (XMASCount, XMASCount) { let puzzle_matrix = read_ceres_puzzle_input(input); diff --git a/src/advent_of_code/thu_05.rs b/src/advent_of_code/day_05.rs similarity index 88% rename from src/advent_of_code/thu_05.rs rename to src/advent_of_code/day_05.rs index 710c5c0..d646dab 100644 --- a/src/advent_of_code/thu_05.rs +++ b/src/advent_of_code/day_05.rs @@ -2,6 +2,12 @@ use utils::read_rules_and_queue; use super::*; +pub fn today() { + let (queue_mid_sum, fixed_queue_mid_sum) = 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); +} + pub fn mid_queue_sum(input: &str) -> (u32, u32) { let (rules, queues) = read_rules_and_queue(input); diff --git a/src/advent_of_code/fri_06.rs b/src/advent_of_code/day_06.rs similarity index 91% rename from src/advent_of_code/fri_06.rs rename to src/advent_of_code/day_06.rs index 7536580..16804ae 100644 --- a/src/advent_of_code/fri_06.rs +++ b/src/advent_of_code/day_06.rs @@ -2,6 +2,13 @@ use std::collections::HashSet; use super::*; +pub fn today() { + let (guard_position_count, loop_obstacle_count) = + guard_gallivant("./assets/day_6_guard_map_input"); + println!("The guard will visit {} positions", guard_position_count); + println!("The guard would loop on {} positions", loop_obstacle_count); +} + impl Guard { fn step(&mut self, map: &FloorMap) -> IsGuardOut { let mut future_x = self.x; diff --git a/src/advent_of_code/sat_07.rs b/src/advent_of_code/day_07.rs similarity index 94% rename from src/advent_of_code/sat_07.rs rename to src/advent_of_code/day_07.rs index 2a09af6..96c239b 100644 --- a/src/advent_of_code/sat_07.rs +++ b/src/advent_of_code/day_07.rs @@ -1,5 +1,10 @@ use super::*; +pub fn today() { + let calibration_result = bridge_repair("./assets/day_7_calibrations_input"); + println!("The total calibration result is {}", calibration_result); +} + pub fn bridge_repair(input: &str) -> CalibrationResult { let equation_vec = utils::read_calibration_equations(input); let mut sum_result: CalibrationResult = 0; diff --git a/src/advent_of_code/sun_08.rs b/src/advent_of_code/day_08.rs similarity index 92% rename from src/advent_of_code/sun_08.rs rename to src/advent_of_code/day_08.rs index 9f7d790..9c50f8b 100644 --- a/src/advent_of_code/sun_08.rs +++ b/src/advent_of_code/day_08.rs @@ -4,41 +4,25 @@ use utils::read_antena_map_input; use super::*; +pub fn today() { + let (antinode_count, antinode_count_any) = + resonant_collinearity("./assets/day_8_antena_map_input"); + println!("The total antinode positions is {}", antinode_count); + println!( + "The total antinode positions in any grid is {}", + antinode_count_any + ); +} + pub fn resonant_collinearity(input: &str) -> (AntinodeCount, AntinodeCount) { let (roof_map, antena_list) = read_antena_map_input(input); ( get_antinode_set_of_aligned_position(&antena_list, &roof_map).len(), - get_antinode_set_of_any_aligned_position(&antena_list, &roof_map).len(), + 0, ) } -pub fn get_antinode_set_of_any_aligned_position( - antena_list: &AntenaList, - map: &RoofMap, -) -> AntinodeList { - let mut antinode_list: AntinodeList = HashSet::new(); - - for antena in antena_list { - for complementary_antena in antena_list { - if antena != complementary_antena && antena.2 == complementary_antena.2 { - let distance_x = (antena.1 as i32 - complementary_antena.1 as i32).abs() as usize; - let distance_y = (antena.0 as i32 - complementary_antena.0 as i32).abs() as usize; - - let mut count: usize = 0; - - // loop { - // let test_x = distance_x * count; - // } - - // antinode_list.insert(pair); - } - } - } - - antinode_list -} - pub fn get_antinode_set_of_aligned_position( antena_list: &AntenaList, map: &RoofMap, @@ -200,8 +184,8 @@ pub fn is_station_between(a: (usize, usize), b: (usize, usize), map: &RoofMap) - let x_diff = (a.1 as i32 - b.1 as i32).abs() as usize; 'check_diagonal: loop { - let mut next_x: i32 = 0; - let mut next_y: i32 = 0; + let next_x: i32; + let next_y: i32; if a.1 > b.1 { if a.0 > b.0 { @@ -240,6 +224,7 @@ pub fn is_station_between(a: (usize, usize), b: (usize, usize), map: &RoofMap) - } } } + if let Some(_) = map[next_y as usize][next_x as usize] { return true; } diff --git a/src/advent_of_code/mon_09.rs b/src/advent_of_code/day_09.rs similarity index 90% rename from src/advent_of_code/mon_09.rs rename to src/advent_of_code/day_09.rs index 255a71a..9b4e005 100644 --- a/src/advent_of_code/mon_09.rs +++ b/src/advent_of_code/day_09.rs @@ -1,5 +1,10 @@ use super::{utils::read_disk_map_input, DiskChecksum, DiskMap}; +pub fn today() { + let disk_checksum = disk_fragmenter("./assets/day_9_disk_input"); + println!("The disk checksum is {}", disk_checksum); +} + pub fn disk_fragmenter(input: &str) -> DiskChecksum { let disk_map = read_disk_map_input(input); diff --git a/src/advent_of_code/tue_10.rs b/src/advent_of_code/day_10.rs similarity index 92% rename from src/advent_of_code/tue_10.rs rename to src/advent_of_code/day_10.rs index 95db3bc..223b674 100644 --- a/src/advent_of_code/tue_10.rs +++ b/src/advent_of_code/day_10.rs @@ -2,6 +2,12 @@ use utils::read_trail_map_input; use super::*; +pub fn today() { + let (trailhead_score, full_trailhead_score) = hoof_it("./assets/day_10_trail_map_input"); + println!("The trail head sum score is {}", trailhead_score); + println!("The full trail head sum score is {}", full_trailhead_score); +} + pub fn hoof_it(input: &str) -> (usize, usize) { let trail_map = read_trail_map_input(input); diff --git a/src/advent_of_code/wed_11.rs b/src/advent_of_code/day_11.rs similarity index 73% rename from src/advent_of_code/wed_11.rs rename to src/advent_of_code/day_11.rs index c3d60ce..6f29791 100644 --- a/src/advent_of_code/wed_11.rs +++ b/src/advent_of_code/day_11.rs @@ -1,5 +1,20 @@ use super::*; +pub fn today() { + let blink_count: usize = 25; + let stone_count = plutonian_pebbles("./assets/day_11_stone_arrangement_input", blink_count); + println!( + "The total of stones after {} is {}", + blink_count, stone_count + ); + let blink_count: usize = 75; + let stone_count = plutonian_pebbles("./assets/day_11_stone_arrangement_input", blink_count); + println!( + "The total of stones after {} is {}", + blink_count, stone_count + ); +} + pub fn plutonian_pebbles(input: &str, blink_count: usize) -> StoneCount { let stone_list = utils::read_stone_arrangement(input); diff --git a/src/advent_of_code/thu_12.rs b/src/advent_of_code/day_12.rs similarity index 96% rename from src/advent_of_code/thu_12.rs rename to src/advent_of_code/day_12.rs index 139e733..6f77a32 100644 --- a/src/advent_of_code/thu_12.rs +++ b/src/advent_of_code/day_12.rs @@ -1,5 +1,10 @@ use super::*; +pub fn today() { + let fence_cost = garden_groups("./assets/day_12_garden_input"); + println!("The garden fence total cost is {}", fence_cost); +} + pub fn garden_groups(input: &str) -> usize { let garden = utils::read_garden_arrangement_input(input); diff --git a/src/advent_of_code/mod.rs b/src/advent_of_code/mod.rs index f1ab46a..f7a572a 100644 --- a/src/advent_of_code/mod.rs +++ b/src/advent_of_code/mod.rs @@ -1,105 +1,60 @@ -// mod sun_01; -// mod mon_02; -// mod tue_03; -// mod wed_04; -// mod thu_05; -// mod fri_06; -// mod sat_07; -// mod sun_08; -// mod mon_09; -// mod tue_10; -// mod wed_11; -mod thu_12; +mod day_01; +mod day_02; +mod day_03; +mod day_04; +mod day_05; +mod day_06; +mod day_07; +mod day_08; +mod day_09; +mod day_10; +mod day_11; +mod day_12; mod types; mod utils; use types::*; -pub fn today() { - historian_hysteria() -} - -pub fn historian_hysteria() { - // NOTE: previous days are commented to speed up (all the blame is on day 6) - - // Sunday 01 - // let key = sun_01::get_key("./assets/day_1_input").unwrap(); - // println!("The key is: {key}"); - // let similarity = sun_01::get_similarity("./assets/day_1_input"); - // println!("The similarity is: {similarity}"); - - // Monday 02 - // let safe_report_count = mon_02::check_reports_safety("./assets/day_2_reports_input"); - // println!("There are {safe_report_count} safe reports"); - - // Tuesday 03 - // let multiplication_added_result = tue_03::mull_it_over("./assets/day_3_instruction_input"); - // println!( - // "The result of the sum of multiplications is {}", - // multiplication_added_result - // ); - // let conditional_multiplication_added_result = - // tue_03::mull_it_over_conditional("./assets/day_3_instruction_input"); - // println!( - // "The result of the conditional sum of multiplications is {}", - // conditional_multiplication_added_result - // ); - - // Wednesday 04 - // let (xmas_appearances, x_mas_appearances) = wed_04::ceres_search("./assets/day_4_input"); - // println!("XMAS appears {} times", xmas_appearances); - // println!("X-MAS appears {} times", x_mas_appearances); - - // Thursday 05 - // 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); - - // Friday 06 - // let (guard_position_count, loop_obstacle_count) = - // fri_06::guard_gallivant("./assets/day_6_guard_map_input"); - // println!("The guard will visit {} positions", guard_position_count); - // println!("The guard would loop on {} positions", loop_obstacle_count); - - // Saturday 07 - // let calibration_result = sat_07::bridge_repair("./assets/day_7_calibrations_input"); - // println!("The total calibration result is {}", calibration_result); - - // Sunday 08 - // let (antinode_count, antinode_count_any) = - // sun_08::resonant_collinearity("./assets/day_8_antena_map_input"); - // println!("The total antinode positions is {}", antinode_count); - // println!( - // "The total antinode positions in any grid is {}", - // antinode_count_any - // ); - - // Monday 09 - // let disk_checksum = mon_09::disk_fragmenter("./assets/day_9_disk_input"); - // println!("The disk checksum is {}", disk_checksum); - - // Tuesday 10 - // let (trailhead_score, full_trailhead_score) = - // tue_10::hoof_it("./assets/day_10_trail_map_input"); - // println!("The trail head sum score is {}", trailhead_score); - // println!("The full trail head sum score is {}", full_trailhead_score); - // let blink_count: usize = 25; - // let stone_count = - // wed_11::plutonian_pebbles("./assets/day_11_stone_arrangement_input", blink_count); - // println!( - // "The total of stones after {} is {}", - // blink_count, stone_count - // ); - // let blink_count: usize = 75; - // let stone_count = - // wed_11::plutonian_pebbles("./assets/day_11_stone_arrangement_input", blink_count); - // println!( - // "The total of stones after {} is {}", - // blink_count, stone_count - // ); - - // Thursday 12 - let fence_cost = thu_12::garden_groups("./assets/day_12_garden_input"); - println!("The garden fence total cost is {}", fence_cost); +pub fn today(day: u8) { + match day { + 1 => { + day_01::today(); + } + 2 => { + day_02::today(); + } + 3 => { + day_03::today(); + } + 4 => { + day_04::today(); + } + 5 => { + day_05::today(); + } + 6 => { + day_06::today(); + } + 7 => { + day_07::today(); + } + 8 => { + day_08::today(); + } + 9 => { + day_09::today(); + } + 10 => { + day_10::today(); + } + 11 => { + day_11::today(); + } + 12 => { + day_12::today(); + } + _ => { + println!("Not a valid day."); + } + } } diff --git a/src/main.rs b/src/main.rs index 90ad74a..7fd0180 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,18 @@ -#![allow(dead_code)] +use std::env; + +// #![allow(dead_code)] mod advent_of_code; fn main() { - advent_of_code::today(); + let args: Vec = env::args().collect(); + println!("<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>"); + println!(">>> Welcome to advent of code 2024 <<<"); + println!("<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>"); + if args.len() == 2 { + let day: u8 = args[1].parse().expect("Not a valid day."); + advent_of_code::today(day); + } else { + println!("Tell me a day!") + } println!("Happy new year!"); }