#include #include #include #include #include #include #include #include #include char input[] = { #embed "input.txt" ,'\0' // null terminator }; //char input[] = "L68\nL30\nR48\nL5\nR60\nL55\nL1\nL99\nR14\nL82\n"; int width = 0; int height = 0; uint64_t result = 0; uint64_t parseNum(char* str, int* len){ int i = 0; uint64_t out = 0; while(str[i] != ',' && str[i] != '-' && str[i] != '\n'){ out += str[i]-0x30; out *= 10; i++; } out /=10; *len = i; return out; } int numPlaces (uint64_t n) { int r = 1; while (n > 9) { n /= 10; r++; } //printf("%d has %d places\n", n, r); return r; } uint64_t power(uint64_t base, uint64_t exp) { uint64_t i, result = 1; for (i = 0; i < exp; i++) result *= base; return result; } bool check_silly(uint64_t in){ int num = numPlaces(in); if(!(num%2)){ uint64_t div = 1+power(10, num/2); //printf("check dividend is %d\n", div); if(in%div == 0){ return true; } } return false; } void sort_ranges(uint64_t* starts, uint64_t* ends, int len){ int curr_min = 0; for(int i = 0; istarts[o]){ curr_min = o; } } uint64_t tmp_start = starts[curr_min]; uint64_t tmp_end = ends[curr_min]; starts[curr_min] = starts[i]; ends[curr_min] = ends[i]; starts[i] = tmp_start; ends[i] = tmp_end; } } int main(int argc, char *argv[]){ clock_t start, end; start = clock(); printf("INT_MAX: %d\n", INT_MAX); int i = 0; int num_ranges = 1; while(input[i] != 0){ if(input[i]==','){ num_ranges++; } i++; } uint64_t starts[num_ranges]; uint64_t ends[num_ranges]; i = 0; int range_num = 0; int len = 0; while(input[i] != 0){ starts[range_num] = parseNum(&input[i], &len); i+=len+1; ends[range_num] = parseNum(&input[i], &len); i+=len+1; //printf("%d-%d\n", starts[range_num], ends[range_num]); range_num++; } sort_ranges(starts, ends, num_ranges); for(i = 0; i