-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbingo.rs
116 lines (102 loc) · 2.38 KB
/
bingo.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
use std::convert::TryInto;
use std::io;
use std::io::BufRead as _;
use std::vec::Vec;
const SIZE: usize = 5;
struct Board {
numbers: [usize; SIZE*SIZE],
marked: [bool; SIZE*SIZE],
}
impl Board {
fn new(num: &[usize; SIZE*SIZE]) -> Self {
return Self {
numbers: *num,
marked: [false; SIZE*SIZE],
};
}
fn row_completed(&self, row: usize) -> bool {
let mut count = 0;
for x in 0..SIZE {
if self.marked[row * SIZE + x] {
count += 1;
}
}
return count == SIZE;
}
fn col_completed(&self, col: usize) -> bool {
let mut count = 0;
for y in 0..SIZE {
if self.marked[y * SIZE + col] {
count += 1;
}
}
return count == SIZE;
}
fn mark_number(&mut self, num: usize) -> bool {
let mut complete = false;
for i in 0..SIZE*SIZE {
if self.numbers[i] != num {
continue;
}
self.marked[i] = true;
if complete {
continue;
}
let row = i / SIZE;
if self.row_completed(row) {
complete = true;
} else {
let col = i % SIZE;
complete = self.col_completed(col);
}
}
return complete;
}
fn get_score(&self, multiplier: usize) -> usize {
return multiplier * self.numbers.iter()
.enumerate()
.filter(|(i, _)| !self.marked[*i])
.fold(0, |acc, (_, val)| acc + val);
}
}
fn str_to_vec(s: &str, delim: &str) -> Vec<usize> {
s.split(delim)
.filter(|x| x.len() > 0)
.map(|x| x.parse::<usize>().unwrap())
.collect::<Vec<usize>>()
}
fn main() {
let mut lines = io::BufReader::new(io::stdin()).lines();
let draw = str_to_vec(&lines.next().unwrap().unwrap(), ",");
let mut boards = vec![];
loop {
// Skip empty line before each board
if lines.next().is_none() {
break;
}
let mut numbers = vec![];
for _ in 0..SIZE {
let mut nums = str_to_vec(&lines.next().unwrap().unwrap(), " ");
if nums.len() != SIZE {
panic!("Wrong number of numbers in row: expected {}, got {}", SIZE, nums.len());
}
numbers.append(&mut nums);
}
boards.push(Board::new(&numbers[0..SIZE*SIZE].try_into().unwrap()));
}
let mut completed = vec![false; boards.len()];
let mut compl_count = 0;
for n in draw {
eprintln!("Marking '{}'...", n);
for (i, b) in boards.iter_mut().enumerate() {
if !completed[i] && b.mark_number(n) {
eprintln!("Board #{} is complete! Board score: {}", (i+1), b.get_score(n));
completed[i] = true;
compl_count += 1;
}
}
if compl_count == boards.len() {
break;
}
}
}