aocc23

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

uppgb.c (840B)


      1 #include "common.h"
      2 
      3 int main(int argc, char **argv) {
      4   char **lines;
      5   size_t nlines = readlines(&lines, "input");
      6   size_t i, j;
      7   uint64_t card;
      8   uint64_t sum = 0;
      9   uint64_t copies[nlines];
     10   smallset ls[nlines], rs[nlines], in[nlines];
     11 
     12   parse_sets(ls, rs, lines, nlines);
     13 
     14   for (i = 0; i < nlines; i++) {
     15     copies[i] = 1;
     16   }
     17 
     18   for (i = 0; i < nlines; i++) {
     19     smallset_init(&in[i], 128);
     20     smallset_intersection(&in[i], &ls[i], &rs[i]);
     21 
     22     card = smallset_cardinality(&in[i]);
     23     for (j = i + 1; j <= i + card; j++) {
     24       if (j >= nlines)
     25         break;
     26       copies[j] += copies[i];
     27     }
     28   }
     29 
     30   for (i = 0; i < nlines; i++) {
     31     sum += copies[i];
     32   }
     33 
     34   printf("%llu\n", sum);
     35 
     36   for (i = 0; i < nlines; i++) {
     37     smallset_clear(&in[i]);
     38     smallset_clear(&ls[i]);
     39     smallset_clear(&rs[i]);
     40   }
     41 
     42   return 0;
     43 }