usestd::collections::HashMap;usestd::str::FromStr;#[derive(Debug)]enumInstr<'a>{Mask(&'astr),Mem(u64,u64),}impl<'a>From<&'astr>forInstr<'a>{fnfrom(s:&'astr)->Self{ifs.starts_with("mask"){Instr::Mask(&s[7..])}elseifs.starts_with("mem"){letaddr_value=&muts[4..].split("] = ");letaddr:u64=addr_value.next().unwrap().parse().unwrap();letvalue:u64=addr_value.next().unwrap().parse().unwrap();Instr::Mem(addr,value)}else{panic!("Invalid line found: {}",s)}}}structMaskParts{or_mask:u64,and_mask:u64,floating_bits:Vec<usize>,}implFromStrforMaskParts{typeErr=();fnfrom_str(mask:&str)->Result<Self,Self::Err>{letmutand_mask=0;letmutor_mask=0;letmutfloating_bits:Vec<usize>=Vec::with_capacity(36);mask.chars().enumerate().for_each(|(i,c)|{and_mask<<=1;or_mask<<=1;ifc=='1'{or_mask|=1;}ifc!='0'{and_mask|=1;}ifc=='X'{floating_bits.push(35-i)}});Ok(MaskParts{or_mask,and_mask,floating_bits,})}}pubfnpart1(input:&str)->u64{letinstr=input.lines().map(|x|x.into());letmutmem:HashMap<u64,u64>=HashMap::new();letmutmask_parts:MaskParts="X".repeat(36).parse().unwrap();forinstructionininstr{matchinstruction{Instr::Mask(mask)=>{mask_parts=mask.parse().unwrap();}Instr::Mem(key,val)=>{mem.insert(key,val&mask_parts.and_mask|mask_parts.or_mask);}}}mem.values().sum()}pubfnpart2(input:&str)->u64{letinstr=input.lines().map(|x|x.into());letmutmem:HashMap<u64,u64>=HashMap::new();letmutmask_parts:MaskParts="X".repeat(36).parse().unwrap();forinstructionininstr{matchinstruction{Instr::Mask(mask)=>{mask_parts=mask.parse().unwrap();}Instr::Mem(addr,val)=>{letbase_addr=addr|mask_parts.or_mask;// Now we have to do n inserts where n = 2.pow(numX)foriin0..2_u64.pow(mask_parts.floating_bits.len()asu32){letmutfinal_addr=base_addr;for(from_bit,to_bit)inmask_parts.floating_bits.iter().enumerate(){ifi&(1<<from_bit)!=0{final_addr|=1<<to_bit;}else{final_addr&=!(1<<to_bit);}}mem.insert(final_addr,val);}}}}mem.values().sum()}
We did this in a live coding session available on YouTube:
Part 1 and 2 in Rust ( github.com/lmammino/rust-advent/bl... ):
We did this in a live coding session available on YouTube: