Dag 11 aoc done, ik vind dp stom
This commit is contained in:
6
advent_of_code/2024/11/Cargo.toml
Normal file
6
advent_of_code/2024/11/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "main"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
1
advent_of_code/2024/11/input.txt
Normal file
1
advent_of_code/2024/11/input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
6563348 67 395 0 6 4425 89567 739318
|
||||||
121
advent_of_code/2024/11/src/main.rs
Normal file
121
advent_of_code/2024/11/src/main.rs
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
fn parse(input: &str) -> Vec<u64> {
|
||||||
|
input
|
||||||
|
.split_whitespace()
|
||||||
|
.map(|stone| stone.parse().unwrap())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_1(input: &str) -> usize {
|
||||||
|
let stones = parse(input);
|
||||||
|
let mut current_stones = stones.clone();
|
||||||
|
|
||||||
|
// I know, this is very naive
|
||||||
|
for _ in 0..25 {
|
||||||
|
let mut new_stones = vec![];
|
||||||
|
|
||||||
|
for stone in current_stones {
|
||||||
|
if let 0 = stone {
|
||||||
|
new_stones.push(1);
|
||||||
|
} else {
|
||||||
|
let ss = stone.to_string();
|
||||||
|
|
||||||
|
if ss.len() % 2 == 0 {
|
||||||
|
let (front, back) = ss.split_at(ss.len() / 2);
|
||||||
|
new_stones.push(front.parse().unwrap());
|
||||||
|
new_stones.push(back.parse().unwrap());
|
||||||
|
} else {
|
||||||
|
new_stones.push(stone * 2024);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
current_stones = new_stones;
|
||||||
|
}
|
||||||
|
|
||||||
|
current_stones.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_2(input: &str) -> u64 {
|
||||||
|
let stones = parse(input);
|
||||||
|
|
||||||
|
// Now for the dynamic programming version
|
||||||
|
let mut dp: HashMap<u64, u64> = HashMap::new();
|
||||||
|
for stone in stones {
|
||||||
|
dp.insert(stone, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for _ in 0..75 {
|
||||||
|
let mut new_dp: HashMap<u64, u64> = HashMap::new();
|
||||||
|
for (stone, cnt) in dp.into_iter() {
|
||||||
|
let ss = stone.to_string();
|
||||||
|
if stone == 0 {
|
||||||
|
match new_dp.get_mut(&1) {
|
||||||
|
None => {
|
||||||
|
new_dp.insert(1, cnt);
|
||||||
|
}
|
||||||
|
Some(c) => *c += cnt,
|
||||||
|
};
|
||||||
|
} else if ss.len() % 2 == 0 {
|
||||||
|
let (front, back) = ss.split_at(ss.len() / 2);
|
||||||
|
let front = front.parse::<u64>().unwrap();
|
||||||
|
let back = back.parse::<u64>().unwrap();
|
||||||
|
|
||||||
|
match new_dp.get_mut(&front) {
|
||||||
|
None => {
|
||||||
|
new_dp.insert(front, cnt);
|
||||||
|
}
|
||||||
|
Some(c) => *c += cnt,
|
||||||
|
}
|
||||||
|
match new_dp.get_mut(&back) {
|
||||||
|
None => {
|
||||||
|
new_dp.insert(back, cnt);
|
||||||
|
}
|
||||||
|
Some(c) => *c += cnt,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let new_stone = 2024 * stone;
|
||||||
|
match new_dp.get_mut(&new_stone) {
|
||||||
|
None => {
|
||||||
|
new_dp.insert(new_stone, cnt);
|
||||||
|
}
|
||||||
|
Some(c) => *c += cnt,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dp = new_dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
dp.values().sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, this is Patrick!");
|
||||||
|
|
||||||
|
let input = include_str!("../input.txt");
|
||||||
|
|
||||||
|
let result_1 = solve_1(input);
|
||||||
|
println!(
|
||||||
|
"The number of stones after blinking 25 times is {}",
|
||||||
|
result_1
|
||||||
|
);
|
||||||
|
|
||||||
|
let result_2 = solve_2(input);
|
||||||
|
println!(
|
||||||
|
"After blinking 75 times, the number of stones is {}",
|
||||||
|
result_2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_1() {
|
||||||
|
let test_input = include_str!("../test.txt");
|
||||||
|
assert_eq!(solve_1(test_input), 55312);
|
||||||
|
}
|
||||||
|
}
|
||||||
1
advent_of_code/2024/11/test.txt
Normal file
1
advent_of_code/2024/11/test.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
125 17
|
||||||
Reference in New Issue
Block a user