Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/advent-of-code-2021
Path: blob/main/src/day04.rs
97 views
1
type Board = Vec<(i32, bool)>;
2
3
pub fn run() {
4
let mut input_parts = include_str!("inputs/day04").split("\n\n");
5
let numbers: Vec<i32> = input_parts
6
.next()
7
.unwrap()
8
.split(",")
9
.map(|s| s.parse().unwrap())
10
.collect();
11
let mut boards: Vec<Board> = input_parts
12
.map(|s| {
13
s.split_whitespace()
14
.map(|s| (s.parse().unwrap(), false))
15
.collect()
16
})
17
.collect();
18
let board_count = boards.len();
19
let mut board_win_order = vec![];
20
21
for number in numbers {
22
for (board_index, board) in boards.iter_mut().enumerate() {
23
if board_win_order.contains(&board_index) {
24
continue;
25
}
26
for (num, marked) in board.iter_mut() {
27
if *num == number {
28
*marked = true;
29
}
30
}
31
if has_complete_line(board) || has_complete_column(board) {
32
board_win_order.push(board_index);
33
34
if board_win_order.len() == 1 || board_win_order.len() == board_count {
35
let unmarked_sum: i32 = board
36
.iter()
37
.filter(|(_, marked)| !marked)
38
.map(|(n, _)| *n)
39
.sum();
40
println!("{}", unmarked_sum * number);
41
}
42
}
43
}
44
}
45
}
46
47
fn has_complete_line(board: &Board) -> bool {
48
(0..5).any(|line| (0..5).all(|i| board[line * 5 + i].1))
49
}
50
51
fn has_complete_column(board: &Board) -> bool {
52
(0..5).any(|col| (0..5).all(|i| board[col + 5 * i].1))
53
}
54
55