advent2025

Advent of Code 2025 Solutions
git clone git://bsandro.tech/advent2025
Log | Files | Refs | README | LICENSE

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 }