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"
|
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"
|
||||||
|
|
|
@ -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
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