aocc23

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

uppgb.c (1304B)


      1 #include "common.h"
      2 
      3 #define MAXCORNERS 2048
      4 
      5 static inline int64_t hex_to_n(const char *s, const size_t n) {
      6   size_t i;
      7   int64_t r = 0;
      8 
      9   for (i = 0; i < n; i++) {
     10     assert(('0' <= s[i] && s[i] <= '9') || ('a' <= s[i] && s[i] <= 'f'));
     11     r <<= 4;
     12     if (s[i] <= '9')
     13       r += (int64_t)(s[i] - '0');
     14     else
     15       r += (int64_t)(s[i] - 'a') + 10;
     16   }
     17 
     18   return r;
     19 }
     20 
     21 static inline pos_t to_move(const char *s) {
     22   pos_t res;
     23   int64_t n = hex_to_n(&s[1], 5);
     24   switch (s[6]) {
     25   case '0':
     26     res = (pos_t){n, 0};
     27     break;
     28   case '1':
     29     res = (pos_t){0, -n};
     30     break;
     31   case '2':
     32     res = (pos_t){-n, 0};
     33     break;
     34   case '3':
     35     res = (pos_t){0, n};
     36     break;
     37   }
     38   return res;
     39 }
     40 
     41 int main() {
     42   pos_t cornetto[MAXCORNERS];
     43   cornetto[0].x = 0;
     44   cornetto[0].y = 0;
     45   size_t ncornetto = 1;
     46   FILE *f = fopen("input", "r");
     47   char col[8];
     48   col[7] = '\0';
     49   char dir;
     50   int64_t n;
     51 
     52   while (ncornetto < MAXCORNERS &&
     53          fscanf(f, "%c %lld (%7s)\n", &dir, &n, &col) != EOF) {
     54     pos_t move = to_move(col);
     55     cornetto[ncornetto].x = cornetto[ncornetto - 1].x + move.x;
     56     cornetto[ncornetto].y = cornetto[ncornetto - 1].y + move.y;
     57     ncornetto++;
     58   }
     59   assert(ncornetto < MAXCORNERS);
     60 
     61   int64_t a = area(cornetto, ncornetto);
     62   printf("area = %lld\n", a);
     63 
     64   fclose(f);
     65 }