3e5b0087a272eaeb3261985b966ccbe80bb4ed53
[advent21.git] / 05a.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdbool.h>
4
5 struct line { enum {horz, vert} d; int x1; int y1; int x2; int y2; };
6
7 #define max(x, y) ((x)>(y) ? (x) : (y))
8 #define min(x, y) ((x)<(y) ? (x) : (y))
9 #define between(a, a1, a2) ((a) >= min(a1, a2) && (a) <= max(a1, a2))
10
11 int parse_lines(struct line lines[], int *maxx, int *maxy)
12 {
13 int i = 0;
14 char buf[1000];
15 while (fgets(buf, 1000, stdin) != NULL) {
16 char *p = &buf[0];
17 lines[i].x1 = strtol(p, &p, 10);
18 p++;
19 lines[i].y1 = strtol(p, &p, 10);
20 p+=4;
21 lines[i].x2 = strtol(p, &p, 10);
22 p++;
23 lines[i].y2 = strtol(p, &p, 10);
24 if (lines[i].x1 == lines[i].x2)
25 lines[i].d = vert;
26 else if (lines[i].y1 == lines[i].y2)
27 lines[i].d = horz;
28 else
29 continue;
30 *maxx = max(*maxx, lines[i].x1);
31 *maxx = max(*maxx, lines[i].x2);
32 *maxy = max(*maxy, lines[i].y1);
33 *maxy = max(*maxy, lines[i].y2);
34 i++;
35 }
36 return i;
37 }
38
39 bool online(int x, int y, struct line line)
40 {
41 switch (line.d) {
42 case vert:
43 return x == line.x1 && between(y, line.y1, line.y2);
44 case horz:
45 return y == line.y1 && between(x, line.x1, line.x2);
46 }
47 return false;
48 }
49
50 int main()
51 {
52 struct line lines[1000];
53 int maxx = 0, maxy = 0;
54 int nlines = parse_lines(lines, &maxx, &maxy);
55 int r = 0;
56 for (int x = 0; x<=maxx; x++) {
57 for (int y = 0; y<=maxy; y++) {
58 int matches = 0;
59 for (int line = 0; line<nlines && matches < 2; line++)
60 if (online(x, y, lines[line]))
61 matches++;
62 r = matches >= 2 ? r+1 : r;
63 }
64 }
65 printf("%d\n", r);
66 }