aoc

Thing1's 2025 aoc
Log | Files | Refs

2b.c (1052B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <stdbool.h>
      4 #include <string.h>
      5 
      6 typedef struct range {
      7 	long long int upper, lower;
      8 } range;
      9 
     10 bool
     11 readrange(FILE *in, range *r) {
     12 	fscanf(in, "%lld-%lld", &r->lower, &r->upper);
     13 	return (getc(in) == ',') ? 1 : 0;
     14 }
     15 
     16 bool
     17 isrepeat(char *s1, char *s2, int i) {
     18 	do {
     19 		s1 += i;
     20 		if (s1[0] == 0) break;
     21 		if (memcmp(s1, s2, i) != 0) return false;
     22 	} while (s1[0] != 0);
     23 	return true;
     24 }
     25 
     26 bool
     27 isvalid(long long int i) {
     28 	char str[20] = {0}, str2[20] = {0};
     29 	int mid = 0;
     30 
     31 	snprintf(str, 20, "%lld", i);
     32 
     33 	for (int i = 1; i < (strlen(str) / 2) + 1; i++) {
     34 		memset(str2, 0, 20);
     35 		memcpy(str2, str, i);
     36 		if (isrepeat(str, str2, i)) return false;
     37 	}
     38 
     39 	return true;
     40 }
     41 
     42 long long int
     43 checkrange(range r) {
     44 	long long int total = 0;
     45 	for (long long int i = r.lower; i <= r.upper; i++) {
     46 		if (!isvalid(i)) total += i;
     47 	}
     48 	return total;
     49 }
     50 
     51 int
     52 main() {
     53 	range r;
     54 	long long int total = 0;
     55 
     56 	while (readrange(stdin, &r))
     57 		total += checkrange(r);
     58 	total += checkrange(r);
     59 
     60 	printf("%lld\n", total);
     61 	return 0;
     62 }