advent2025

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

day05.c (2475B)


      1 #include <stdio.h>
      2 #include <stdbool.h>
      3 #include <string.h>
      4 #include <inttypes.h>
      5 
      6 #include "cputime.h"
      7 
      8 #define LEN(x) (sizeof((x))/sizeof((x)[0]))
      9 #define BUF_SIZE 40
     10 #define RANGE_SIZE 188
     11 
     12 typedef struct {
     13     uint64_t from;
     14     uint64_t to;
     15 } Range;
     16 
     17 int add_range(Range ranges[RANGE_SIZE], Range r, int cur) {
     18     for (int i=0;i<cur;++i) {
     19         if (r.from<=ranges[i].from && r.to>=ranges[i].to) {
     20             ranges[i] = r;
     21             return cur;
     22         }
     23         if (r.from>=ranges[i].from && r.from<=ranges[i].to && r.to>ranges[i].to) {
     24             ranges[i].to = r.to;
     25             return cur;
     26         }
     27         if (r.to>=ranges[i].from && r.to<=ranges[i].to && r.from<ranges[i].from) {
     28             ranges[i].from = r.from;
     29             return cur;
     30         }
     31         if (r.from>=ranges[i].from && r.to<=ranges[i].to) {
     32             return cur;
     33         }
     34     }
     35     ranges[cur++] = r;
     36     return cur;
     37 }
     38 
     39 uint64_t sum_ranges(Range ranges[RANGE_SIZE], int cnt) {
     40     uint64_t sum = 0;
     41     for (int i=0;i<cnt;++i) {
     42         if (ranges[i].from==0 && ranges[i].from==ranges[i].to) continue;
     43         sum += ranges[i].to-ranges[i].from+1;
     44     }
     45     return sum;
     46 }
     47 
     48 int main(void) {
     49     char buf[BUF_SIZE] = {0};
     50     bool is_ranges = true;
     51     Range ranges[RANGE_SIZE] = {0};
     52     int cur_range = 0;
     53     int p1 = 0;
     54     while (fgets(buf, sizeof(buf), stdin)) {
     55         if (is_ranges&&strlen(buf)==1) {
     56             is_ranges=false;
     57             continue;
     58         }
     59         if (is_ranges) {
     60             Range r = {0};
     61             sscanf(buf, "%"PRIu64" - %"PRIu64, &r.from, &r.to);
     62             cur_range = add_range(ranges, r, cur_range);
     63         } else {
     64             uint64_t num = 0;
     65             sscanf(buf, "%"PRIu64, &num);
     66             for (int i=0;i<RANGE_SIZE;++i) {
     67                 if (num>=ranges[i].from && num<=ranges[i].to) {
     68                     p1++;
     69                     break;
     70                 }
     71             }
     72         }
     73     }
     74 
     75     // fold ranges
     76     int cnt = RANGE_SIZE;
     77     while (1) {
     78         int cur = 0;
     79         Range ranges1[RANGE_SIZE] = {0};
     80         for (int i=0;i<cnt;++i) {
     81             if (ranges[i].from==0&&ranges[i].to==0) continue;
     82             cur = add_range(ranges1, ranges[i], cur);
     83         }
     84         memset(ranges, 0, sizeof(ranges));
     85         memcpy(ranges, ranges1, sizeof(ranges1));
     86         if (cnt == cur) break;
     87         cnt = cur;
     88     }
     89 
     90     uint64_t p2 = sum_ranges(ranges, cnt);
     91 
     92     printf("p1: %d, p2: %"PRIu64"\n", p1, p2);
     93     return 0;
     94 }