solving part two
This commit is contained in:
+67
-2
@@ -50,6 +50,53 @@ fn get_sum_priorities_errors(rucksacks: Vec<String>) -> u32 {
|
|||||||
total_priority_errors
|
total_priority_errors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Group {
|
||||||
|
rucksacks: [String; 3],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Group {
|
||||||
|
// get first occurence of the first rucksack's commonality with other two rucksacks
|
||||||
|
pub fn get_common_item(&self) -> Item {
|
||||||
|
for item in self.rucksacks[0].chars() {
|
||||||
|
// convert char to &str
|
||||||
|
let item_string = item.to_string();
|
||||||
|
let item = Item::from_str(&item_string);
|
||||||
|
if self.rucksacks[1].contains(&item_string) && self.rucksacks[2].contains(&item_string)
|
||||||
|
{
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
panic!("no common item found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the item of each group that is common to all rucksacks
|
||||||
|
// get the priority of that item
|
||||||
|
fn get_priority_all_groups_badge(rucksacks: Vec<String>) -> u32 {
|
||||||
|
let mut total_badges_priorities = 0;
|
||||||
|
|
||||||
|
// organize the rucksacks into groups of 3
|
||||||
|
let mut i = 0;
|
||||||
|
while i < rucksacks.len() {
|
||||||
|
let group = Group {
|
||||||
|
rucksacks: [
|
||||||
|
rucksacks[i].to_string(),
|
||||||
|
rucksacks[i + 1].to_string(),
|
||||||
|
rucksacks[i + 2].to_string(),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
let common_item = group.get_common_item();
|
||||||
|
let prioriy = common_item.get_priority();
|
||||||
|
total_badges_priorities += prioriy;
|
||||||
|
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_badges_priorities
|
||||||
|
}
|
||||||
|
|
||||||
fn read_input_file(file_name: &str) -> Vec<String> {
|
fn read_input_file(file_name: &str) -> Vec<String> {
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
@@ -71,16 +118,20 @@ fn main() {
|
|||||||
|
|
||||||
let input = read_input_file("input.txt");
|
let input = read_input_file("input.txt");
|
||||||
|
|
||||||
let total_priority_errors = get_sum_priorities_errors(input);
|
let total_priority_errors = get_sum_priorities_errors(input.clone());
|
||||||
println!("total priority errors: {}", total_priority_errors);
|
println!("total priority errors: {}", total_priority_errors);
|
||||||
|
|
||||||
|
let total_badges_priorities = get_priority_all_groups_badge(input);
|
||||||
|
println!("total badges priorities: {}", total_badges_priorities);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
// part 1
|
||||||
#[test]
|
#[test]
|
||||||
fn test_base_case() {
|
fn test_total_errors() {
|
||||||
let input: Vec<String> = vec![
|
let input: Vec<String> = vec![
|
||||||
"vJrwpWtwJgWrhcsFMMfFFhFp".to_string(),
|
"vJrwpWtwJgWrhcsFMMfFFhFp".to_string(),
|
||||||
"jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(),
|
"jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(),
|
||||||
@@ -91,4 +142,18 @@ mod tests {
|
|||||||
];
|
];
|
||||||
assert_eq!(get_sum_priorities_errors(input), 157);
|
assert_eq!(get_sum_priorities_errors(input), 157);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// part 2
|
||||||
|
#[test]
|
||||||
|
fn test_badge_priorities() {
|
||||||
|
let input: Vec<String> = vec![
|
||||||
|
"vJrwpWtwJgWrhcsFMMfFFhFp".to_string(),
|
||||||
|
"jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL".to_string(),
|
||||||
|
"PmmdzqPrVvPwwTWBwg".to_string(),
|
||||||
|
"wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn".to_string(),
|
||||||
|
"ttgJtRGJQctTZtZT".to_string(),
|
||||||
|
"CrZsJsPPZsGzwwsLwLmpwMDw".to_string(),
|
||||||
|
];
|
||||||
|
assert_eq!(get_priority_all_groups_badge(input), 70);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user