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