day11 part1 works, part2 not yet.
This commit is contained in:
parent
0a0a4ec5d9
commit
aa9dab827f
4 changed files with 93 additions and 1 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -60,6 +60,10 @@ version = "0.1.0"
|
|||
name = "day10"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "day11"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.4"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[workspace]
|
||||
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]
|
||||
winnow = "0.6"
|
||||
|
|
6
day11/Cargo.toml
Normal file
6
day11/Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "day11"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
82
day11/src/main.rs
Normal file
82
day11/src/main.rs
Normal 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));
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue