add solution for day 3

This commit is contained in:
Leo Drachenfeuer 2022-12-07 03:49:26 +01:00
parent bcb48a67f6
commit eea727df47
Signed by: dragonleo
GPG key ID: A8338FC081137CF0

View file

@ -1,4 +1,111 @@
use crate::cli::PathBuf;
use crate::util::read_lines;
#[derive(Debug,Clone)]
struct Backpack {
complete: Vec<Item>,
compartment1: Vec<Item>,
compartment2: Vec<Item>,
equal_items: Vec<Item>,
}
impl Backpack {
fn from_str(s: &str) -> Self {
let vchar: Vec<char> = s.chars().collect();
let (p1, p2) = vchar.split_at(vchar.len() / 2);
let com1:Vec<Item> = p1.iter().map(|c| Item::from_char(*c)).collect();
let com2:Vec<Item> = p2.iter().map(|c| Item::from_char(*c)).collect();
let mut eqvec:Vec<Item> = 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<Backpack>){
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<Backpack>){
let bpgroup = bpacks.chunks(3);
let mut mark_total: u32 = 0;
for bg in bpgroup {
let temp_vec:Vec<Backpack> = 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<PathBuf>, alt: &bool) {
if let Ok(lines) = read_lines(file.as_ref().unwrap().as_path()) {
let bpacks: Vec<Backpack> = lines.map(|ln| Backpack::from_str(&ln.unwrap())).collect();
if *alt{
part2(&bpacks);
}else {
part1(&bpacks);
}
}
}