#include #include #include #include int count_digit(unsigned long long num){ int len = 0; while (num!=0) { num /= 10; len++; } return len; } int part_one_invalid(unsigned long long num) { int answer = 0; int len = count_digit(num); if (len%2) { answer = 0; } //it gonna be pair so no worry unsigned long long halfer = pow(10, len/2); if (num/halfer == num%halfer) { answer = 1; } return answer; } int part_two_invalid(unsigned long long num) { int answer = 0; int len = count_digit(num); int j; for (int i =1; i<=len/2; i++) { if (!((len%i)==0)) { continue; } int chunk_num = len/i; // use / and % to isolate chunks, with powers of 10 to the i long long first = num % (long long)pow(10, i); for (j = 1; j< chunk_num; j++) { long long chunk = num % (long long)pow(10,i*(j+1))/ (long long)pow(10,i*j); if (chunk != first) { break; } } if (j == chunk_num) { answer=1; } } return answer; } int main (int argc, char* argv[]) { FILE* f = NULL; char* line = NULL; unsigned long long start = 0; unsigned long long end = 0; long long front_part = 0; long long end_part = 0; unsigned long long invalid_sum = 0; ssize_t nlength; size_t size = 0; f = fopen(argv[1],"r"); while ((nlength = getdelim(&line, &size, ',', f) != -1)) { start = atoll(strsep(&line, "-")); end = atoll(strsep(&line, "-")); printf("start: %llu ",start); printf("end: %llu\n",end); for (unsigned long long i = start; i<=end; i++) { if (part_two_invalid(i)) { invalid_sum += i; printf("invalid number found: %llu\n",i); } } } printf("invalid sum: %llu", invalid_sum); free(line); free(f); return 0; }