day02.c (1916B)
1 #include <stdio.h> 2 #include <inttypes.h> 3 #include <math.h> 4 #include <string.h> 5 #include <stdbool.h> 6 #include "cputime.h" 7 8 typedef struct Range { 9 uint64_t first; 10 uint64_t last; 11 } Range; 12 13 int digits(uint64_t num) { 14 return log10l(num)+1; 15 } 16 17 uint64_t btoi(int bufl, uint64_t buf[bufl]) { 18 uint64_t num = 0; 19 for (int i=0;i<bufl;++i) num = num*10+buf[i]; 20 return num; 21 } 22 23 void itoa(uint64_t num, char str[16]) { 24 int d = digits(num); 25 for (int i=d-1;i>=0;--i) { 26 str[i] = num%10+'0'; 27 num = num/10; 28 } 29 str[d] = '\0'; 30 } 31 32 bool is_silly1(uint64_t num) { 33 int d = digits(num); 34 if (d%2==0) { 35 long shift = powl(10, d/2); 36 uint64_t top = num/shift; 37 uint64_t bottom = num-(top*shift); 38 return top==bottom; 39 } 40 return false; 41 } 42 43 bool is_silly2(uint64_t num) { 44 int d = digits(num); 45 char s[16]; 46 itoa(num, s); 47 for (int i=1;i<=d/2;++i) { // checking pattern 0-i 48 if (d%i!=0) continue; 49 int rep = 0; 50 for (int j=0;j<d;j+=i) { 51 rep |= strncmp(s, s+j, i); 52 } 53 if (rep==0) return true; 54 } 55 return false; 56 } 57 58 struct Res { 59 uint64_t p1; 60 uint64_t p2; 61 }; 62 63 void sum_silly(Range range, struct Res *r) { 64 for (uint64_t i=range.first;i<=range.last;++i) { 65 if (is_silly1(i)) r->p1+=i; 66 if (is_silly2(i)) r->p2+=i; 67 } 68 } 69 70 int main(void) { 71 uint64_t buf[16] = {0}; 72 int bufl = 0; 73 Range range = {0}; 74 struct Res r = {0}; 75 for (int c=getchar();c!=EOF;c=getchar()) { 76 if (c>='0'&&c<='9') { 77 buf[bufl++] = c-'0'; 78 } else if (c=='-') { 79 range.first = btoi(bufl, buf); 80 bufl = 0; 81 } else if (c==','||c=='\n') { 82 range.last = btoi(bufl, buf); 83 bufl = 0; 84 sum_silly(range, &r); 85 } 86 } 87 printf("p1: %" PRIu64 "\np2: %" PRIu64 "\n", r.p1, r.p2); 88 return 0; 89 }