diff --git a/aoc_2024/src/day9.rs b/aoc_2024/src/day9.rs index d5335a4..8739fdd 100644 --- a/aoc_2024/src/day9.rs +++ b/aoc_2024/src/day9.rs @@ -62,19 +62,30 @@ fn part2(input: &Input) -> usize { for i in 1..input.len() { input[i].0 = input[i - 1].0 + input[i - 1].1; } + let mut min_idx = [1; 10]; // println!("{:?}", &input); let mut sum = 0; for r_idx in (0..input.len()).step_by(2).rev() { let val = r_idx / 2; let count = input[r_idx].2; // println!("attempt: {:?}", input[r_idx]); - for l_idx in (1..r_idx).step_by(2) { + for l_idx in (min_idx[count]..r_idx).step_by(2) { if input[l_idx].1 >= input[r_idx].2 { // print!("{:?}", input[l_idx]); input[r_idx].0 = input[l_idx].0; input[l_idx].1 -= input[r_idx].2; input[l_idx].0 += input[r_idx].2; input[l_idx - 1].1 += input[r_idx].2; + + for i in count..10 { + if min_idx[i] > min_idx[count] { + break; + } else { + while min_idx[i] <= r_idx && input[min_idx[i]].1 < i { + min_idx[i] += 2; + } + } + } // println!(" -> {:?}", input[l_idx]); break; } @@ -95,12 +106,18 @@ mod tests { #[test] fn part1_example() { assert_eq!(part1(&parse("2333133121414131402")), 1928); - // assert_eq!(part1(&parse(include_str!("../input/2024/day8.txt"))), 273); + assert_eq!( + part1(&parse(include_str!("../input/2024/day9.txt").trim_end())), + 6337921897505 + ); } #[test] fn part2_example() { assert_eq!(part2(&parse("2333133121414131402")), 2858); - // assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017); + assert_eq!( + part2(&parse(include_str!("../input/2024/day9.txt").trim_end())), + 6362722604045 + ); } }