mirror of
https://github.com/tomru/adventofcode.git
synced 2026-03-03 06:27:19 +01:00
day 04 task 2
This commit is contained in:
@@ -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> {
|
||||||
|
|||||||
Reference in New Issue
Block a user