complete day 2

This commit is contained in:
Blizzard Finnegan 2023-12-02 14:58:00 -05:00
parent 99ac6449d5
commit abf5bc2b57
Signed by: blizzardfinnegan
GPG key ID: 61C1E13067E0018E

View file

@ -1,69 +1,74 @@
use std::fs;
const HEADER:&str = "Game";
const RED:&str = "red";
const RED_MAX:u8 = 12;
const GREEN:&str = "green";
const GREEN_MAX:u8 = 13;
const BLUE:&str = "blue";
const BLUE_MAX:u8 = 14;
const SPACE:char = ' ';
const COLOUR_SEPARATOR:char = ',';
const PULL_SEPARATOR:char = ';';
const HEADER_SEPARATOR:char = ':';
#[derive(Clone, Copy, Default,PartialEq,Eq,Debug)]
struct PullMins{
pub red:u32,
pub green:u32,
pub blue:u32
}
const FILE_NAME:&str = "./data/data.txt";
fn main() {
let file_contents = fs::read_to_string(FILE_NAME).unwrap();
let lines:Vec<&str> = file_contents.split('\n').collect();
let mut final_output = 0;
let mut final_output:usize = 0;
for line in lines{
//Game #: # colour, # colour; # colour, # colour
if !line.contains(HEADER_SEPARATOR) { break; }
let (header,pulls) = line.split_once(HEADER_SEPARATOR).unwrap();
let (_,index) = header.trim().split_at(HEADER.len());
let (_,pulls) = line.split_once(HEADER_SEPARATOR).unwrap();
let pulls:Vec<&str> = pulls.split(PULL_SEPARATOR).collect();
if check_game(pulls){
final_output += index.trim().parse::<i64>().unwrap();
};
let game_mins = check_game(pulls);
final_output += game_mins.red as usize * game_mins.green as usize * game_mins.blue as usize;
//if check_game(pulls){
// final_output += index.trim().parse::<i64>().unwrap();
//};
};
println!("{}",final_output);
}
fn check_game(pulls:Vec<&str>) -> bool{
fn check_game(pulls:Vec<&str>) -> PullMins{
let mut game_mins = PullMins{ red:1,green:1,blue:1};
for pull in pulls{
if !check_pull(pull) { return false };
let mins = check_pull(pull);
let red:u32; let green:u32; let blue:u32;
match game_mins.red < mins.red {
true => red = mins.red,
false => red = game_mins.red
};
match game_mins.green < mins.green {
true => green = mins.green,
false => green = game_mins.green
};
match game_mins.blue < mins.blue {
true => blue = mins.blue,
false => blue = game_mins.blue
};
game_mins = PullMins{ red, green, blue };
}
true
game_mins
}
fn check_pull(pull:&str) -> bool{
fn check_pull(pull:&str) -> PullMins{
let colours:Vec<&str> = pull.split(COLOUR_SEPARATOR).collect();
let mut pull_mins = PullMins::default();
for colour in colours{
let (count,name) = colour.trim().split_once(SPACE).unwrap();
match is_safe(name.trim(),count.trim().parse::<u8>().unwrap()){
true => {
continue;
},
false => {
return false;
},
let (unparsed_count,name) = colour.trim().split_once(SPACE).unwrap();
let count:u32 = unparsed_count.trim().parse().unwrap();
match name.trim(){
RED => { pull_mins.red += count; },
GREEN => { pull_mins.green += count; },
BLUE => { pull_mins.blue += count; },
_ => { panic!("Invalid input code!"); }
};
};
true
pull_mins
}
fn is_safe(colour:&str,value:u8) -> bool{
match colour{
RED => {
return value <= RED_MAX;
},
GREEN => {
return value <= GREEN_MAX;
},
BLUE => {
return value <= BLUE_MAX;
},
_ => { panic!("invalid input file!"); }
};
}