aocc22

Advent of Code 2022
git clone git://www.tkruger.se/aocc22.git
Log | Files | Refs | README

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 }