day11 part1 works, part2 not yet.

This commit is contained in:
Joe Ardent 2025-01-08 12:21:14 -08:00
parent 0a0a4ec5d9
commit aa9dab827f
4 changed files with 93 additions and 1 deletions

4
Cargo.lock generated
View file

@ -60,6 +60,10 @@ version = "0.1.0"
name = "day10" name = "day10"
version = "0.1.0" version = "0.1.0"
[[package]]
name = "day11"
version = "0.1.0"
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.4" version = "2.7.4"

View file

@ -1,6 +1,6 @@
[workspace] [workspace]
resolver = "2" resolver = "2"
members = ["day01", "day02", "day03", "day04", "day05", "day06", "day07", "day08", "day09", "day10"] members = ["day01", "day02", "day03", "day04", "day05", "day06", "day07", "day08", "day09", "day10", "day11"]
[workspace.dependencies] [workspace.dependencies]
winnow = "0.6" winnow = "0.6"

6
day11/Cargo.toml Normal file
View file

@ -0,0 +1,6 @@
[package]
name = "day11"
version = "0.1.0"
edition = "2024"
[dependencies]

82
day11/src/main.rs Normal file
View file

@ -0,0 +1,82 @@
use std::collections::VecDeque;
fn main() {
let input = std::fs::read_to_string("input").unwrap();
let stones = parse(&input);
println!("{}", pt1(&stones));
println!("{}", pt2(&stones));
}
fn pt1(stones: &[u128]) -> usize {
blink2(stones, 25)
}
fn pt2(stones: &[u128]) -> usize {
let mut total = 0;
for stone in stones {
total += blink2(&[*stone], 75);
}
total
}
fn blink2(stones: &[u128], blinks: usize) -> usize {
let mut stones = VecDeque::from_iter(stones.iter().copied());
for _blink in 0..blinks {
let mut rots = 0;
while rots < stones.len() {
let stone = stones[0];
let digits = stone.to_string();
match stone {
0 => {
stones[0] = 1;
stones.rotate_left(1);
rots += 1;
}
_ if digits.len() % 2 == 0 => {
let mid = digits.len() / 2;
let left = digits[0..mid].parse().unwrap();
let right = digits[mid..].parse().unwrap();
stones[0] = left;
stones.rotate_left(1);
stones.push_front(right);
stones.rotate_left(1);
rots += 2;
}
_ => {
stones[0] = stone * 2024;
stones.rotate_left(1);
rots += 1;
}
}
}
stones.rotate_right(rots);
}
stones.len()
}
fn parse(input: &str) -> Vec<u128> {
input
.trim()
.split(' ')
.map(|v| v.parse().unwrap())
.collect()
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn p1() {
let stones = parse("125 17");
assert_eq!(55312, pt1(&stones));
}
#[test]
fn p2() {
let stones = parse("125 17");
assert_eq!(22, blink2(&stones, 6));
}
}