diff --git a/src/cli/commands/day003.rs b/src/cli/commands/day003.rs index 8213436..394bf0e 100644 --- a/src/cli/commands/day003.rs +++ b/src/cli/commands/day003.rs @@ -1,4 +1,111 @@ use crate::cli::PathBuf; use crate::util::read_lines; +#[derive(Debug,Clone)] +struct Backpack { + complete: Vec, + compartment1: Vec, + compartment2: Vec, + equal_items: Vec, +} + +impl Backpack { + fn from_str(s: &str) -> Self { + let vchar: Vec = s.chars().collect(); + let (p1, p2) = vchar.split_at(vchar.len() / 2); + let com1:Vec = p1.iter().map(|c| Item::from_char(*c)).collect(); + let com2:Vec = p2.iter().map(|c| Item::from_char(*c)).collect(); + let mut eqvec:Vec = Vec::new(); + for c in com1.iter(){ + if com2.contains(&c) { + eqvec.push(c.clone()); + break; + } + } + Backpack { + complete: vchar.iter().map(|c| Item::from_char(*c)).collect(), + compartment1: (com1), + compartment2: (com2), + equal_items: (eqvec), + } + } + + fn print(&self){ + println!("compartment 1 ({:?})", self.compartment1.len()); + for c in self.compartment1.iter() { + println!("{:?}", c); + } + println!("compartment 2 ({:?})", self.compartment2.len()); + for c in self.compartment2.iter() { + println!("{:?}", c); + } + println!("found equals ({:?})", self.equal_items.len()); + for c in self.equal_items.iter() { + println!("{:?}", c); + } + } +} + +#[derive(Debug, Clone)] +struct Item { + itype: char, + prio: u8, +} + +impl Item { + fn from_char(c: char) -> Self { + let value:u8; + if c.is_lowercase(){ + value = c as u8 - 96; + }else{ + value = c as u8 - 38; + } + Item { itype: (c), prio:(value) } + } +} + +impl PartialEq for Item { + fn eq(&self, other: &Self) -> bool { + self.itype == other.itype + } +} + +fn part1 (bpacks:&Vec){ + let mut toatal_prio:u32 = 0; + for bp in bpacks.iter() { + for i in bp.equal_items.iter(){ + toatal_prio += i.prio as u32; + } + } + println!("{:?}", bpacks.len()/3); + println!("{:?}", toatal_prio); +} + +fn part2 (bpacks:&Vec){ + let bpgroup = bpacks.chunks(3); + let mut mark_total: u32 = 0; + for bg in bpgroup { + let temp_vec:Vec = bg.to_vec(); + let b1:&Backpack = temp_vec.get(0).unwrap(); + let b2:&Backpack = temp_vec.get(1).unwrap(); + let b3:&Backpack = temp_vec.get(2).unwrap(); + for i in b1.complete.iter() { + if b2.complete.contains(&i) && b3.complete.contains(&i) { + mark_total += i.prio as u32; + break; + } + } + } + println!("{:?}", mark_total); +} + +pub fn subcmd_day003(file: &Option, alt: &bool) { + if let Ok(lines) = read_lines(file.as_ref().unwrap().as_path()) { + let bpacks: Vec = lines.map(|ln| Backpack::from_str(&ln.unwrap())).collect(); + if *alt{ + part2(&bpacks); + }else { + part1(&bpacks); + } + } }