diff --git a/day19/Cargo.lock b/day19/Cargo.lock new file mode 100644 index 0000000..0cb741d --- /dev/null +++ b/day19/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "day19" +version = "0.1.0" diff --git a/day19/Cargo.toml b/day19/Cargo.toml new file mode 100644 index 0000000..22f2ec1 --- /dev/null +++ b/day19/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day19" +version = "0.1.0" +edition = "2024" + +[dependencies] + +[profile.release] +lto = "fat" diff --git a/day19/src/main.rs b/day19/src/main.rs new file mode 100644 index 0000000..66a38c4 --- /dev/null +++ b/day19/src/main.rs @@ -0,0 +1,42 @@ +#[cfg(debug_assertions)] +const LENGTH: usize = 5; +#[cfg(not(debug_assertions))] +const LENGTH: usize = 3_017_957; + +fn main() { + let mut pointer = 0; + let mut has_presents = [true; LENGTH]; + let mut next_elf = [0; LENGTH]; + + for (idx, val) in next_elf.iter_mut().enumerate() { + *val = (idx + 1) % LENGTH; + } + + 'outer: loop { + let mut offset = 1; + loop { + let idx = (pointer + offset) % LENGTH; + if has_presents[idx] { + has_presents[idx] = false; + pointer = idx; + break; + } else { + offset += 1; + } + } + let count = has_presents.iter().filter(|b| **b).count(); + println!("{count}"); + if count == 1 { + let correct_idx = has_presents + .iter() + .enumerate() + .filter(|(_, b)| **b) + .map(|(i, _)| i) + .next() + .unwrap() + + 1; + println!("{correct_idx}"); + break 'outer; + } + } +}