From a008ef248f69cc1c04b48fb8a88184fd0dc21d2a Mon Sep 17 00:00:00 2001 From: Ricardo Holmes Date: Mon, 9 Dec 2024 19:00:42 +0000 Subject: [PATCH] Complete day 9 part 2 --- 2024/examples/day_9_1.txt | 1 + 2024/src/solutions/day_9.rs | 68 ++++++++++++++++++++++++++++++++++++- README.md | 3 +- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 2024/examples/day_9_1.txt diff --git a/2024/examples/day_9_1.txt b/2024/examples/day_9_1.txt new file mode 100644 index 0000000..5ff5aae --- /dev/null +++ b/2024/examples/day_9_1.txt @@ -0,0 +1 @@ +2333133121414131402 \ No newline at end of file diff --git a/2024/src/solutions/day_9.rs b/2024/src/solutions/day_9.rs index bc2510c..f9234de 100644 --- a/2024/src/solutions/day_9.rs +++ b/2024/src/solutions/day_9.rs @@ -40,7 +40,65 @@ pub fn part_one(input: &[Parsed]) -> Result { } pub fn part_two(input: &[Parsed]) -> Result { - Ok(0) + let mut grouped: Vec<(Option,usize)> = vec![]; + let mut input_iter = input.iter(); + + while input_iter.len() > 0 { + // println!("{:?}", input_iter.clone().collect::>>()); + let value = input_iter.next().unwrap().clone(); + let count = 1 + input_iter.clone().take_while(|v| **v == value).count(); + if count > 1 { + input_iter.nth(count-2); // -2 since next consumed one already and 0 index + } + grouped.push((value, count)); + } + + let mut index = grouped.len() - 1; + while index > 0 { + let (id, len) = grouped[index]; + + if id.is_some() { + let mut dest = None; + for (j, &(y, l)) in grouped[0..index].iter().enumerate() { + if y.is_some() || l < len { + continue; + } + + dest = Some(j); + break; + } + + if let Some(j) = dest { + if grouped[j].1 == len { + grouped[index].0 = None; + grouped[j].0 = id; + } + else { // need to split the new segment + grouped[index].0 = None; + grouped[j].0 = None; + grouped[j].1 = grouped[j].1 - len; + grouped.insert(j, (id, len)); + index += 1; // avoid decrementing index + } + } + } + + index -= 1; + } + + + Ok( + grouped.iter().fold((0,0), |(p,t), &(id,l)| { + ( + p + l, + if let Some(x) = id { + t + x * (p..p+l).sum::() + } else { + t + } + ) + }).1 + ) } #[cfg(test)] @@ -54,5 +112,13 @@ mod tests { let solution = part_one(&parsed); assert_eq!(solution, Ok(1928)); } + + #[test] + fn test_part2() { + let example = include_str!("../../examples/day_9_1.txt"); + let parsed = parse(example).unwrap(); + let solution = part_two(&parsed); + assert_eq!(solution, Ok(2858)); + } } diff --git a/README.md b/README.md index 735b05f..b4cf64d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ | 6 | [:star2:][2019-6] | [:star2:][2020-6] | [:star2:][2021-6] | [:star2:][2022-6] | [:star2:][2023-6] | [:star2:][2024-6] | | 7 | [:star:][2019-7] | [:star2:][2020-7] | [:star2:][2021-7] | [:star2:][2022-7] | [:star2:][2023-7] | [:star2:][2024-7] | | 8 | [:star2:][2019-8] | [:star2:][2020-8] | [:star2:][2021-8] | [:star2:][2022-8] | [:star2:][2023-8] | [:star2:][2024-8] | -| 9 | | [:star2:][2020-9] | [:star2:][2021-9] | [:star2:][2022-9] | [:star2:][2023-9] | | +| 9 | | [:star2:][2020-9] | [:star2:][2021-9] | [:star2:][2022-9] | [:star2:][2023-9] | [:star2:][2024-9] | | 10 | | [:star2:][2020-10] | [:star2:][2021-10] | [:star2:][2022-10] | [:star2:][2023-10] | | | 11 | | [:star2:][2020-11] | [:star2:][2021-11] | [:star2:][2022-11] | [:star2:][2023-11] | | | 12 | | [:star2:][2020-12] | [:star2:][2021-12] | [:star2:][2022-12] | [:star2:][2023-12] | | @@ -147,3 +147,4 @@ [2024-6]: ./2024/src/solutions/day_6.rs [2024-7]: ./2024/src/solutions/day_7.rs [2024-8]: ./2024/src/solutions/day_8.rs +[2024-9]: ./2024/src/solutions/day_9.rs