diff --git a/day11/Cargo.lock b/day11/Cargo.lock new file mode 100644 index 0000000..4f31108 --- /dev/null +++ b/day11/Cargo.lock @@ -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", +] diff --git a/day11/Cargo.toml b/day11/Cargo.toml new file mode 100644 index 0000000..a636639 --- /dev/null +++ b/day11/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day11" +version = "0.1.0" +edition = "2021" + +[dependencies] +ahash = "0.8.11" diff --git a/day11/src/main.rs b/day11/src/main.rs new file mode 100644 index 0000000..d954bd3 --- /dev/null +++ b/day11/src/main.rs @@ -0,0 +1,54 @@ +use ahash::AHashMap; + +fn parse(input: &str) -> Vec { + 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)); +}