complete day 2
This commit is contained in:
parent
99ac6449d5
commit
abf5bc2b57
1 changed files with 42 additions and 37 deletions
|
@ -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!"); }
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue