advent2025

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

day03.c (1317B)


      1 #define _GNU_SOURCE
      2 
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <inttypes.h>
      6 #include <string.h>
      7 #include "cputime.h"
      8 
      9 static const uint64_t pow10[] = {
     10     1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12
     11 };
     12 
     13 typedef struct {
     14     int buf[100];
     15     int cnt;
     16 } Buffer;
     17 
     18 int find_max(int *buf, int len) {
     19     int m = 0;
     20     for (int i=0;i<len;++i) {
     21         if (buf[i]>buf[m]) m=i;
     22     }
     23     return m;
     24 }
     25 
     26 int part1(Buffer *b) {
     27     int i1 = find_max(b->buf, b->cnt-1);
     28     int i2 = find_max(b->buf+i1+1, b->cnt-i1-1)+i1+1;
     29     return b->buf[i1]*10+b->buf[i2];
     30 }
     31 
     32 uint64_t part2(Buffer *b) {
     33     uint64_t num = 0;
     34     int li = -1;
     35     int w = b->cnt-12;
     36     for (int i=0;i<12;++i) {
     37         int reserve = 12-i;
     38         int offset = li+1;
     39         w = b->cnt-(reserve+offset-1);
     40         if (reserve==1) w = b->cnt-offset;
     41         li = find_max(b->buf+offset, w) + offset;
     42         num += b->buf[li]*pow10[12-i-1];
     43     }
     44     return num;
     45 }
     46 
     47 int main(void) {
     48     Buffer b = {0};
     49     int p1 = 0;
     50     uint64_t p2 = 0;
     51     for (int c=getchar();c!=EOF;c=getchar()) {
     52         if (c>='0'&&c<='9') {
     53             b.buf[b.cnt++] = c-'0';
     54         } else {
     55             p1 += part1(&b);
     56             p2 += part2(&b);
     57             b.cnt = 0;
     58         }
     59     }
     60     printf("p1: %d\np2: %"PRIu64"\n", p1, p2);
     61     return 0;
     62 }