diff --git a/y2025/resources/2_input.txt b/y2025/resources/2_input.txt new file mode 100644 index 0000000..83cb9ce --- /dev/null +++ b/y2025/resources/2_input.txt @@ -0,0 +1 @@ +8284583-8497825,7171599589-7171806875,726-1031,109709-251143,1039-2064,650391-673817,674522-857785,53851-79525,8874170-8908147,4197684-4326484,22095-51217,92761-107689,23127451-23279882,4145708930-4145757240,375283-509798,585093-612147,7921-11457,899998-1044449,3-19,35-64,244-657,5514-7852,9292905274-9292965269,287261640-287314275,70-129,86249864-86269107,5441357-5687039,2493-5147,93835572-94041507,277109-336732,74668271-74836119,616692-643777,521461-548256,3131219357-3131417388 diff --git a/y2025/src/bin/d2.rs b/y2025/src/bin/d2.rs new file mode 100644 index 0000000..18f2b40 --- /dev/null +++ b/y2025/src/bin/d2.rs @@ -0,0 +1,27 @@ +use std::{fs, time::Instant}; + +use utils::time::get_elapsed_string; +use y2025::days::d2; + +fn main() { + let now = Instant::now(); + println!("Part 1:"); + part1(); + println!("Ran in {}", get_elapsed_string(now.elapsed())); + let now = Instant::now(); + println!("Part 2:"); + part2(); + println!("Ran in {}", get_elapsed_string(now.elapsed())); +} + +fn part1() { + let root = env!("CARGO_MANIFEST_DIR"); + let content = fs::read_to_string(format!("{root}/resources/2_input.txt")).unwrap(); + println!("{}", d2::process_part1(&content)); +} + +fn part2() { + let root = env!("CARGO_MANIFEST_DIR"); + let content = fs::read_to_string(format!("{root}/resources/2_input.txt")).unwrap(); + println!("{}", d2::process_part2(&content)); +} diff --git a/y2025/src/days/d2.rs b/y2025/src/days/d2.rs new file mode 100644 index 0000000..ff23409 --- /dev/null +++ b/y2025/src/days/d2.rs @@ -0,0 +1,91 @@ +use itertools::Itertools; + +pub fn process_part1(input: &str) -> i64 { + input + .split(',') + .map(|range| range.split_once('-').unwrap()) + .map(|(start, end)| { + ( + start + .parse::() + .expect(&format!("Cannot parse start from {start}")), + end.trim_end() + .parse::() + .expect(&format!("Cannot parse end from {end}")), + ) + }) + .map(|(start, end)| { + (start..=end) + .map(|id| { + let id_str = format!("{id}"); + if id_str.starts_with('0') { + return 0; + } + let (left, right) = id_str.split_at(id_str.len() / 2); + if left == right { + return id; + } + 0 + }) + .sum::() + }) + .sum() +} + +pub fn process_part2(input: &str) -> i64 { + input + .split(',') + .map(|range| range.split_once('-').unwrap()) + .map(|(start, end)| { + ( + start + .parse::() + .expect(&format!("Cannot parse start from {start}")), + end.trim_end() + .parse::() + .expect(&format!("Cannot parse end from {end}")), + ) + }) + .map(|(start, end)| { + (start..=end) + .map(|id| { + let id_str = format!("{id}"); + if id_str.starts_with('0') { + return 0; + } + for num_parts in 2..=id_str.len() { + let parts = id_str + .chars() + .chunks(id_str.len() / num_parts) + .into_iter() + .map(|chunk| chunk.collect::()) + .collect::>(); + if parts.iter().all_equal() { + return id; + } + } + 0 + }) + .sum::() + }) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + const INPUT: &str = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; + + #[test] + fn part1() { + let result = process_part1(INPUT); + assert_eq!(result, 1227775554); + } + + #[test] + fn part2() { + let result = process_part2(INPUT); + assert_eq!(result, 4174379265); + } +} diff --git a/y2025/src/days/mod.rs b/y2025/src/days/mod.rs index 52d31d2..7f76109 100644 --- a/y2025/src/days/mod.rs +++ b/y2025/src/days/mod.rs @@ -1 +1,3 @@ pub mod d1; + +pub mod d2;