diff --git a/day02/src/bin/second.rs b/day02/src/bin/second.rs index d9bfacf..9334aac 100644 --- a/day02/src/bin/second.rs +++ b/day02/src/bin/second.rs @@ -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::().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::().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::().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!"); } - }; -}