add solution for day 3
This commit is contained in:
parent
bcb48a67f6
commit
eea727df47
1 changed files with 107 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue