638b4fad535435b78c3c98d2a0ff9c39ebfe9e52
[advent21.git] / 04a.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 int parse_boards(struct board boards[])
26 {
27 int i = 0;
28 while(getchar() == '\n') {
29 for (int row = 0; row<5; row++) {
30 for (int col = 0; col<5; col++) {
31 char buf[3] = {getchar(), getchar(), getchar()};
32 boards[i].numbers[row][col] = atoi(buf);
33 }
34 }
35 i++;
36 }
37 return i;
38 }
39
40 bool board_wins(struct board board)
41 {
42 for (int row = 0; row<5; row++) {
43 bool rowwin = true, colwin = true;
44 for (int col = 0; col<5 && (rowwin || colwin); col++) {
45 rowwin &= board.numbers[row][col] == -1;
46 colwin &= board.numbers[col][row] == -1;
47 }
48 if (rowwin || colwin)
49 return true;
50 }
51 return false;
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 struct board *winner = NULL;
63 int draw;
64 for (draw = 0; draw < ndraws && winner == NULL; draw++) {
65 //Mark boards
66 for (int board = 0; board < nboards; board++)
67 for (int row = 0; row<5; row++)
68 for (int col = 0; col<5; col++)
69 if (boards[board].numbers[row][col] == draws[draw])
70 boards[board].numbers[row][col] = -1;
71 //Check winners
72 for (int board = 0; board < nboards && winner == NULL; board++)
73 if (board_wins(boards[board]))
74 winner = &boards[board];
75 }
76
77 //Calculate sum of unmarked numbers
78 int sum = 0;
79 for (int row = 0; row<5; row++)
80 for (int col = 0; col<5; col++)
81 if (winner->numbers[row][col] != -1)
82 sum += winner->numbers[row][col];
83
84 printf("%d\n", sum*draws[draw-1]);
85 }