Day 11
This commit is contained in:
parent
17b62f7e79
commit
78f7f2db49
|
@ -0,0 +1,47 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
const BLINKS: usize = 75;
|
||||||
|
|
||||||
|
// (value, blinks_remaining)
|
||||||
|
type Stone = (u64, usize);
|
||||||
|
|
||||||
|
pub fn day11() {
|
||||||
|
let mut lut: HashMap<Stone, usize> = HashMap::new();
|
||||||
|
let count: usize = crate::input(11)
|
||||||
|
.split_whitespace()
|
||||||
|
.map(|s| s.parse().unwrap())
|
||||||
|
.map(|v| blink((v, BLINKS), &mut lut))
|
||||||
|
.sum();
|
||||||
|
|
||||||
|
println!("Total Stones: {}", count);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn blink(stone: Stone, lut: &mut HashMap<Stone, usize>) -> usize {
|
||||||
|
if let Some(&count) = lut.get(&stone) {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
let blinked = blink_single(stone);
|
||||||
|
|
||||||
|
let count = match stone.1 {
|
||||||
|
1 => blinked.len(),
|
||||||
|
_ => blinked.iter().map(|&s| blink(s, lut)).sum(),
|
||||||
|
};
|
||||||
|
|
||||||
|
lut.insert(stone, count);
|
||||||
|
count
|
||||||
|
}
|
||||||
|
|
||||||
|
fn blink_single((v, b): Stone) -> Vec<Stone> {
|
||||||
|
match v.to_string().as_str() {
|
||||||
|
"0" => vec![(1, b - 1)],
|
||||||
|
s if s.len() % 2 == 0 => {
|
||||||
|
let mid = s.len() / 2;
|
||||||
|
vec![
|
||||||
|
(s[..mid].parse().unwrap(), b - 1),
|
||||||
|
(s[mid..].parse().unwrap(), b - 1),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
_ => vec![(v * 2024, b - 1)],
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,10 +16,12 @@ mod day7;
|
||||||
mod day8;
|
mod day8;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
mod day9;
|
mod day9;
|
||||||
|
#[allow(dead_code)]
|
||||||
mod day10;
|
mod day10;
|
||||||
|
mod day11;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
day10::day10();
|
day11::day11();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn input(day: u8) -> String {
|
pub fn input(day: u8) -> String {
|
||||||
|
|
Loading…
Reference in New Issue