advent2025

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

day06.c (2182B)


      1 #include <stdio.h>
      2 #include <inttypes.h>
      3 #include "cputime.h"
      4 
      5 // tail -n1 inputs/day06.txt | sed 's/\s/\n/g'|sort|grep '+\|*'|wc -l
      6 #define W 3772
      7 #define H 5
      8 
      9 int btoi(int bufl, int buf[bufl]) {
     10     int num = 0;
     11     for (int i=0;i<bufl;++i) num = num*10+buf[i];
     12     return num;
     13 }
     14 
     15 uint64_t part1(int numbers[H][W], int x, char op) {
     16     uint64_t num = 0;
     17     for (int dy=0;dy<H;++dy) {
     18         if (numbers[dy][x]==0) continue;
     19         if (op=='*') num = (num==0?1:num) * numbers[dy][x];
     20         if (op=='+') num += numbers[dy][x];
     21     }
     22     return num;
     23 }
     24 
     25 uint64_t part2(char digits[H][W], int ymax, int x1, int x2, char op) {
     26     uint64_t res = op=='*'?1:0;
     27     for (int x=x1;x<x2;++x) {
     28         int buf[4] = {0};
     29         int bufl = 0;
     30         for (int y=0;y<ymax;++y) {
     31             if (digits[y][x]!='0')
     32                 buf[bufl++] = digits[y][x]-'0';
     33         }
     34         int num = btoi(bufl, buf);
     35         if (num>0) {
     36             if (op=='+') res += num;
     37             if (op=='*') res *= num;
     38         }
     39     }
     40     return res;
     41 }
     42 
     43 int main(void) {
     44     int numbers[H][W] = {0};
     45     char digits[H][W] = {0};
     46     int x = 0;
     47     int xx = 0;
     48     int x1 = 0;
     49     int y = 0;
     50     int buf[8] = {0};
     51     int bufl = 0;
     52     uint64_t p1 = 0;
     53     uint64_t p2 = 0;
     54     int pc = 0;
     55     for (int c=getchar();c!=EOF;c=getchar()) {
     56         if (c>='0'&&c<='9') {
     57             buf[bufl++] = c-'0';
     58             digits[y][xx++] = c;
     59         } else if (c==' '||c=='\n') {
     60             if (bufl!=0) {
     61                 numbers[y][x] = btoi(bufl, buf);
     62                 bufl = 0;
     63                 x++;
     64             }
     65             if (c=='\n') {
     66                 if (pc!=0) { // I'm tired today
     67                     p2 += part2(digits, y, x1, xx, pc);
     68                 }
     69                 y++;
     70                 x = 0;
     71                 xx= 0;
     72             } else {
     73                 digits[y][xx] = '0';
     74                 xx++;
     75             }
     76         } else if (c=='*'||c=='+') {
     77             p1 += part1(numbers, x, c);
     78             p2 += part2(digits, y, x1, xx, pc);
     79             pc = c;
     80             x1 = xx;
     81             x++;
     82             xx++;
     83         }
     84     }
     85     printf("p1: %"PRIu64"\np2: %"PRIu64"\n", p1, p2);
     86     return 0;
     87 }