cleanup
[advent21.git] / 04b.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <stdbool.h>
5
6 struct board {
7 int numbers[5][5];
8 };
9
10 int parse_draw(int draw[])
11 {
12 char buf[1000];
13 if (fgets(buf, 1000, stdin) == NULL)
14 exit(1);
15 char *tok;
16 int i = 0;
17 tok = strtok(buf, ",");
18 while(tok != NULL) {
19 draw[i++] = atoi(tok);
20 tok = strtok(NULL, ",");
21 }
22 return i;
23 }
24
25 bool board_wins(struct board board)
26 {
27 for (int row = 0; row<5; row++) {
28 bool rowwin = true, colwin = true;
29 for (int col = 0; col<5 && (rowwin || colwin); col++) {
30 rowwin &= board.numbers[row][col] == -1;
31 colwin &= board.numbers[col][row] == -1;
32 }
33 if (rowwin || colwin)
34 return true;
35 }
36 return false;
37 }
38
39 int parse_boards(struct board boards[])
40 {
41 int i = 0;
42 while(getchar() == '\n') {
43 for (int row = 0; row<5; row++) {
44 for (int col = 0; col<5; col++) {
45 char buf[3] = {getchar(), getchar(), getchar()};
46 boards[i].numbers[row][col] = atoi(buf);
47 }
48 }
49 i++;
50 }
51 return i;
52 }
53
54 int main(void)
55 {
56 int draws[1000];
57 int ndraws = parse_draw(draws);
58
59 struct board boards[1000];
60 int nboards = parse_boards(boards);
61
62 int draw;
63 for (draw = 0; draw < ndraws && nboards > 0; draw++) {
64 //Mark boards
65 for (int board = 0; board < nboards; board++)
66 for (int row = 0; row<5; row++)
67 for (int col = 0; col<5; col++)
68 if (boards[board].numbers[row][col] == draws[draw])
69 boards[board].numbers[row][col] = -1;
70 //Check winners
71 for (int board = 0; board < nboards; ) {
72 if (board_wins(boards[board])) {
73 //Remove winner
74 nboards--;
75 for (int i = board; i<nboards; i++)
76 boards[i] = boards[i+1];
77 } else {
78 board++;
79 }
80 }
81 }
82
83 //Calculate sum of unmarked numbers
84 int sum = 0;
85 for (int row = 0; row<5; row++)
86 for (int col = 0; col<5; col++)
87 if (boards[0].numbers[row][col] != -1)
88 sum += boards[0].numbers[row][col];
89
90 printf("%d\n", sum*draws[draw-1]);
91 }