uppga.c (1886B)
1 #include "common.h" 2 3 typedef struct cube { 4 uint64_t coord[3]; 5 size_t nnbrs; 6 size_t *nbrs; 7 } cube; 8 9 void print_cube(cube *c) { 10 printf("(%llu, %llu, %llu)\n", c->coord[0], c->coord[1], c->coord[2]); 11 12 size_t i; 13 printf(" |->"); 14 for (i = 0; i < c->nnbrs; i++) { 15 printf(" %zu", c->nbrs[i]); 16 } 17 printf("\n"); 18 } 19 20 int adjacent(cube *a, cube *b) { 21 int x1 = a->coord[0]; 22 int x2 = b->coord[0]; 23 int y1 = a->coord[1]; 24 int y2 = b->coord[1]; 25 int z1 = a->coord[2]; 26 int z2 = b->coord[2]; 27 return (abs(x1 - x2) <= 1 && y1 == y2 && z1 == z2) || 28 (abs(y1 - y2) <= 1 && x1 == x2 && z1 == z2) || 29 (abs(z1 - z2) <= 1 && x1 == x2 && y1 == y2); 30 } 31 32 void add_nbr(cube *x, size_t nbr_index) { 33 // printf("adding nbrs to cube (%llu, %llu, %llu)\n", x->coord[0], 34 //x->coord[1], x->coord[2]); 35 x->nbrs[x->nnbrs] = nbr_index; 36 x->nnbrs++; 37 } 38 39 uint64_t e(cube *cubes, size_t ncubes) { 40 uint64_t c = 0; 41 42 size_t i; 43 for (i = 0; i < ncubes; i++) 44 c += cubes[i].nnbrs; 45 46 return c / 2; 47 } 48 49 int main(int argc, char **argv) { 50 char **lines; 51 size_t nlines = readlines(&lines, "input"); 52 printf("#lines: %lu\n", nlines); 53 54 cube cubes[nlines]; 55 size_t i, j; 56 for (i = 0; i < nlines; i++) { 57 char *line = lines[i]; 58 line = sread_next_u64(&cubes[i].coord[0], line); 59 line = sread_next_u64(&cubes[i].coord[1], line); 60 line = sread_next_u64(&cubes[i].coord[2], line); 61 62 cubes[i].nnbrs = 0; 63 cubes[i].nbrs = malloc(nlines * sizeof(*(cubes[i].nbrs))); 64 } 65 66 for (i = 0; i < nlines; i++) { 67 for (j = i + 1; j < nlines; j++) { 68 if (adjacent(&cubes[i], &cubes[j])) { 69 add_nbr(&cubes[i], j); 70 add_nbr(&cubes[j], i); 71 } 72 } 73 } 74 75 uint64_t ee = e(cubes, nlines); 76 printf("%llu\n", ee); 77 78 for (i = 0; i < nlines; i++) { 79 print_cube(&cubes[i]); 80 } 81 82 assert(6 * nlines >= ee); 83 printf("%llu\n", 6 * nlines - 2 * ee); 84 }