day05.c (2475B)
1 #include <stdio.h> 2 #include <stdbool.h> 3 #include <string.h> 4 #include <inttypes.h> 5 6 #include "cputime.h" 7 8 #define LEN(x) (sizeof((x))/sizeof((x)[0])) 9 #define BUF_SIZE 40 10 #define RANGE_SIZE 188 11 12 typedef struct { 13 uint64_t from; 14 uint64_t to; 15 } Range; 16 17 int add_range(Range ranges[RANGE_SIZE], Range r, int cur) { 18 for (int i=0;i<cur;++i) { 19 if (r.from<=ranges[i].from && r.to>=ranges[i].to) { 20 ranges[i] = r; 21 return cur; 22 } 23 if (r.from>=ranges[i].from && r.from<=ranges[i].to && r.to>ranges[i].to) { 24 ranges[i].to = r.to; 25 return cur; 26 } 27 if (r.to>=ranges[i].from && r.to<=ranges[i].to && r.from<ranges[i].from) { 28 ranges[i].from = r.from; 29 return cur; 30 } 31 if (r.from>=ranges[i].from && r.to<=ranges[i].to) { 32 return cur; 33 } 34 } 35 ranges[cur++] = r; 36 return cur; 37 } 38 39 uint64_t sum_ranges(Range ranges[RANGE_SIZE], int cnt) { 40 uint64_t sum = 0; 41 for (int i=0;i<cnt;++i) { 42 if (ranges[i].from==0 && ranges[i].from==ranges[i].to) continue; 43 sum += ranges[i].to-ranges[i].from+1; 44 } 45 return sum; 46 } 47 48 int main(void) { 49 char buf[BUF_SIZE] = {0}; 50 bool is_ranges = true; 51 Range ranges[RANGE_SIZE] = {0}; 52 int cur_range = 0; 53 int p1 = 0; 54 while (fgets(buf, sizeof(buf), stdin)) { 55 if (is_ranges&&strlen(buf)==1) { 56 is_ranges=false; 57 continue; 58 } 59 if (is_ranges) { 60 Range r = {0}; 61 sscanf(buf, "%"PRIu64" - %"PRIu64, &r.from, &r.to); 62 cur_range = add_range(ranges, r, cur_range); 63 } else { 64 uint64_t num = 0; 65 sscanf(buf, "%"PRIu64, &num); 66 for (int i=0;i<RANGE_SIZE;++i) { 67 if (num>=ranges[i].from && num<=ranges[i].to) { 68 p1++; 69 break; 70 } 71 } 72 } 73 } 74 75 // fold ranges 76 int cnt = RANGE_SIZE; 77 while (1) { 78 int cur = 0; 79 Range ranges1[RANGE_SIZE] = {0}; 80 for (int i=0;i<cnt;++i) { 81 if (ranges[i].from==0&&ranges[i].to==0) continue; 82 cur = add_range(ranges1, ranges[i], cur); 83 } 84 memset(ranges, 0, sizeof(ranges)); 85 memcpy(ranges, ranges1, sizeof(ranges1)); 86 if (cnt == cur) break; 87 cnt = cur; 88 } 89 90 uint64_t p2 = sum_ranges(ranges, cnt); 91 92 printf("p1: %d, p2: %"PRIu64"\n", p1, p2); 93 return 0; 94 }