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 }