diff --git a/aoc_2024/src/day8.rs b/aoc_2024/src/day8.rs index 94096ab..030c313 100644 --- a/aoc_2024/src/day8.rs +++ b/aoc_2024/src/day8.rs @@ -1,7 +1,6 @@ use hashbrown::{HashMap, HashSet}; use aoc_runner_derive::{aoc, aoc_generator}; -use num::integer::gcd; type Input = ((isize, isize), Vec>); @@ -94,6 +93,7 @@ mod tests { )), 14 ); + assert_eq!(part1(&parse(include_str!("../input/2024/day8.txt"))), 273); } #[test] @@ -104,7 +104,6 @@ mod tests { )), 34 ); - assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017); } } diff --git a/aoc_2024/src/day9.rs b/aoc_2024/src/day9.rs new file mode 100644 index 0000000..d5335a4 --- /dev/null +++ b/aoc_2024/src/day9.rs @@ -0,0 +1,106 @@ +use aoc_runner_derive::{aoc, aoc_generator}; + +type Input = Vec; + +#[aoc_generator(day9)] +fn parse(input: &str) -> Input { + input + .chars() + .map(|c| c.to_digit(10).unwrap() as usize) + .collect() +} + +#[aoc(day9, part1)] +fn part1(input: &Input) -> usize { + let mut sum = 0; + let mut len = input.chunks(2).map(|c| c[0]).sum::(); + let mut l_idx = 0; + let mut l_pos = 0; + let mut r_idx = input.len() + 1; + let mut r_left = 0; + while len > 0 { + if l_idx % 2 == 0 { + for _ in 0..input[l_idx] { + // println!("l {}*{}", l_pos, l_idx / 2); + // print!("{}", l_idx / 2); + len -= 1; + sum += (l_idx / 2) * l_pos; + l_pos += 1; + if len == 0 { + break; + } + } + l_idx += 1; + } else { + for _ in 0..input[l_idx] { + while r_left == 0 { + r_idx -= 2; + r_left = input[r_idx]; + } + // println!("r {}*{}", l_pos, r_idx / 2); + // print!("{}", r_idx / 2); + len -= 1; + sum += (r_idx / 2) * l_pos; + l_pos += 1; + r_left -= 1; + if len == 0 { + break; + } + } + l_idx += 1; + } + } + sum +} + +#[aoc(day9, part2)] +fn part2(input: &Input) -> usize { + let mut input = input + .iter() + .map(|c| (0, *c, *c)) + .collect::>(); + for i in 1..input.len() { + input[i].0 = input[i - 1].0 + input[i - 1].1; + } + // 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) { + 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; + // println!(" -> {:?}", input[l_idx]); + break; + } + } + for i in 0..count { + // println!("{}*{}", (input[r_idx].0 + i), val); + sum += val * (input[r_idx].0 + i); + // input[r_idx].0 += 1; + } + } + sum +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse("2333133121414131402")), 1928); + // assert_eq!(part1(&parse(include_str!("../input/2024/day8.txt"))), 273); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse("2333133121414131402")), 2858); + // assert_eq!(part2(&parse(include_str!("../input/2024/day8.txt"))), 1017); + } +} diff --git a/aoc_2024/src/lib.rs b/aoc_2024/src/lib.rs index 38d6a05..75d847e 100644 --- a/aoc_2024/src/lib.rs +++ b/aoc_2024/src/lib.rs @@ -1,4 +1,3 @@ -mod day8; mod day1; mod day2; mod day3; @@ -6,6 +5,8 @@ mod day4; mod day5; mod day6; mod day7; +mod day8; +mod day9; extern crate aoc_runner;