Add day11

This commit is contained in:
Adrian Groh 2024-12-11 10:41:54 +01:00
parent 0b831d59c9
commit 98aac4153a
Signed by: Gobidev
GPG Key ID: 3AA3153E98B0D771
3 changed files with 180 additions and 0 deletions

119
day11/Cargo.lock generated Normal file
View File

@ -0,0 +1,119 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "ahash"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"getrandom",
"once_cell",
"version_check",
"zerocopy",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "day11"
version = "0.1.0"
dependencies = [
"ahash",
]
[[package]]
name = "getrandom"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "libc"
version = "0.2.168"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d"
[[package]]
name = "once_cell"
version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]]
name = "proc-macro2"
version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [
"proc-macro2",
]
[[package]]
name = "syn"
version = "2.0.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "zerocopy"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn",
]

7
day11/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "day11"
version = "0.1.0"
edition = "2021"
[dependencies]
ahash = "0.8.11"

54
day11/src/main.rs Normal file
View File

@ -0,0 +1,54 @@
use ahash::AHashMap;
fn parse(input: &str) -> Vec<usize> {
input
.split_whitespace()
.map(|n| n.parse().unwrap())
.collect()
}
fn split_number(num: &usize) -> (usize, usize) {
let mut digit_count = 0;
let mut rest = *num;
while rest > 0 {
rest /= 10;
digit_count += 1;
}
let divisor = 10usize.pow(digit_count / 2);
(num % divisor, num / divisor)
}
fn get_amount(num: &usize, steps: &usize, cache: &mut AHashMap<(usize, usize), usize>) -> usize {
if let Some(val) = cache.get(&(*num, *steps)) {
return *val;
}
if steps == &0 {
return 1;
}
let mut res = 0;
if num == &0 {
res += get_amount(&1, &(steps - 1), cache);
} else if num.to_string().chars().count() % 2 == 0 {
let (splitl, splitr) = split_number(num);
res += get_amount(&splitl, &(steps - 1), cache);
res += get_amount(&splitr, &(steps - 1), cache);
} else {
res += get_amount(&(num * 2024), &(steps - 1), cache);
}
cache.insert((*num, *steps), res);
res
}
fn part(input: &[usize], steps: usize) -> usize {
let mut cache = AHashMap::new();
input
.iter()
.map(|n| get_amount(n, &steps, &mut cache))
.sum()
}
fn main() {
let input = parse(include_str!("../input.txt"));
println!("{}", part(&input, 25));
println!("{}", part(&input, 75));
}