diff --git a/day11/src/main.rs b/day11/src/main.rs index 5f19ef4..8c938e9 100644 --- a/day11/src/main.rs +++ b/day11/src/main.rs @@ -8,13 +8,13 @@ fn main() { } fn pt1(stones: &[u128]) -> usize { - blink2(stones, 25) + blink3(stones.to_vec(), 25) } fn pt2(stones: &[u128]) -> usize { let mut total = 0; for stone in stones { - total += blink2(&[*stone], 75); + total += blink3(vec![*stone], 75); } total } @@ -56,6 +56,35 @@ fn blink2(stones: &[u128], blinks: usize) -> usize { stones.len() } +fn blink3(mut stones: Vec<u128>, blinks: usize) -> usize { + let mut total = stones.len(); + for blink in 0..blinks { + let mut rights = Vec::new(); + for stone in stones.iter_mut() { + let digits = stone.to_string(); + match stone { + 0 => { + *stone = 1; + } + _ if digits.len() % 2 == 0 => { + let mid = digits.len() / 2; + let left = digits[0..mid].parse().unwrap(); + let right = digits[mid..].parse().unwrap(); + *stone = left; + rights.push(right); + total += 1; + } + _ => { + *stone *= 2024; + } + } + } + total += blink3(rights, blinks - blink); + } + + total +} + fn parse(input: &str) -> Vec<u128> { input .trim() @@ -77,6 +106,6 @@ mod test { #[test] fn p2() { let stones = parse("125 17"); - assert_eq!(22, blink2(&stones, 6)); + assert_eq!(55312, blink3(stones, 25)); } }