#[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; } } }