day 04 task 2

This commit is contained in:
Thomas Ruoff
2022-01-03 08:50:58 +01:00
parent 62b27cbac0
commit 2a1072a2af

View File

@@ -7,7 +7,7 @@ struct Field {
struct Board { struct Board {
fields: Vec<Field>, fields: Vec<Field>,
won: bool, won: bool,
score: u16, score: u32,
} }
impl std::fmt::Display for Board { impl std::fmt::Display for Board {
@@ -27,18 +27,17 @@ impl std::fmt::Display for Board {
} }
impl Board { impl Board {
fn mark_number(&mut self, draw: u16) { fn mark_number(&mut self, draw: u16) -> Option<u32> {
if self.won { if self.won {
return; return None;
} }
let field = self.fields let field = self.fields
.iter_mut() .iter_mut()
.find(|f| f.value == draw); .find(|f| f.value == draw);
if field.is_none() { if field.is_none() {
return return None
} }
field.unwrap().drawn = true; field.unwrap().drawn = true;
@@ -60,8 +59,11 @@ impl Board {
// calc score // calc score
if self.won { if self.won {
let undrawn_sum = self.fields.iter().filter(|f| !f.drawn).fold(0, |accm, f| accm + f.value ); let undrawn_sum = self.fields.iter().filter(|f| !f.drawn).fold(0, |accm, f| accm + f.value );
self.score = undrawn_sum * draw; self.score = undrawn_sum as u32 * draw as u32;
return Some(self.score);
} }
return None;
} }
} }
@@ -71,18 +73,27 @@ fn main() {
println!("draws: {:?}", draws); println!("draws: {:?}", draws);
let mut boards = parse_boards(&input); let mut boards = parse_boards(&input);
let mut last_board_won: usize = usize::MAX;
let mut last_board_won_score: u32 = u32::MAX;
for draw in draws.iter() { for draw in draws.iter() {
println!("draw: {:?}", draw); println!("draw: {:?}", draw);
for (index, board) in boards.iter_mut().enumerate() { for (index, board) in boards.iter_mut().enumerate() {
board.mark_number(*draw); let score = board.mark_number(*draw);
println!("board {}:\n{}", index, board); println!("board {}:\n{}", index, board);
if board.won {
println!("board {} won with score {}", index, board.score); if score.is_some() {
return; last_board_won_score = score.unwrap();
last_board_won = index;
} }
} }
} }
if last_board_won_score < u32::MAX {
println!("board {} won last with score {}", last_board_won, last_board_won_score);
} else {
println!("only loosers here");
}
} }
fn parse_draws(data: &String) -> Vec<u16> { fn parse_draws(data: &String) -> Vec<u16> {