cleanup
[advent21.git] / 19a.c
1 #include <stdio.h>
2 #include <stdbool.h>
3 #include <string.h>
4
5 struct point {int x; int y; int z; };
6 struct scanner {
7 int num;
8 int npoints;
9 struct point points[100];
10 };
11
12 bool parse_scanner(struct scanner *s)
13 {
14 char *b = NULL;
15 size_t len;
16 if (-1 == getline(&b, &len, stdin))
17 return false;
18 sscanf(b, "--- scanner %d ---\n", &s->num);
19 while (getline(&b, &len, stdin) != -1 && strcmp(b, "\n") != 0) {
20 sscanf(b, "%d,%d,%d\n"
21 , &s->points[s->npoints].x
22 , &s->points[s->npoints].y
23 , &s->points[s->npoints].z);
24 s->npoints++;
25 }
26 return true;
27 }
28
29 struct point orient(struct point p, struct point r, int orientation)
30 {
31 if (orientation == 0)
32 return (struct point){.x=r.x*p.x, .y=r.y*p.y, .z=r.z*p.z};
33 else if (orientation == 1)
34 return (struct point){.x=r.x*p.x, .y=r.y*p.z, .z=r.z*p.y};
35 else if (orientation == 2)
36 return (struct point){.x=r.x*p.y, .y=r.y*p.x, .z=r.z*p.z};
37 else if (orientation == 3)
38 return (struct point){.x=r.x*p.y, .y=r.y*p.z, .z=r.z*p.x};
39 else if (orientation == 4)
40 return (struct point){.x=r.x*p.z, .y=r.y*p.x, .z=r.z*p.y};
41 else if (orientation == 5)
42 return (struct point){.x=r.x*p.z, .y=r.y*p.y, .z=r.z*p.x};
43 else
44 fprintf(stderr, "unknown orientation\n");
45 }
46 struct point rotations[] =
47 { {-1, -1, -1}
48 , {-1, -1, 1}
49 , {-1, 1, -1}
50 , {-1, 1, 1}
51 , { 1, -1, -1}
52 , { 1, -1, 1}
53 , { 1, 1, -1}
54 , { 1, 1, 1}
55 };
56
57 void match_scanners(struct scanner *l, struct scanner *r, int rot, int or)
58 {
59 for (int dx = -1000; dx<1000; dx++) {
60 for (int dy = -1000; dy<1000; dy++) {
61 for (int dz = -1000; dz<1000; dz++) {
62
63
64 }
65 }
66 }
67 }
68
69 int main()
70 {
71 int nscanner = 0;
72 struct scanner scanners[25];
73 while(parse_scanner(&scanners[nscanner]))
74 nscanner++;
75
76 for (int i = 0; i<nscanner; i++) {
77 for (int j = 0; j<nscanner; j++) {
78 if (i == j)
79 continue;
80 for (int rot = 0; rot<8; rot++) {
81 for (int or = 0; or<6; or++) {
82 match_scanners(&scanners[i], &scanners[j], rot, or);
83 }
84 }
85 }
86 }
87
88 }