advent2025

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

commit 2823dda5cf87d879d93c5ebf26b146dabeca0d48
parent afb256e15a18d1ae501cfb9162adfdea1b8c584e
Author: bsandro <email@bsandro.tech>
Date:   Fri,  5 Dec 2025 08:34:59 +0200

day05

Diffstat:
Aday05.c | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+), 0 deletions(-)

diff --git a/day05.c b/day05.c @@ -0,0 +1,94 @@ +#include <stdio.h> +#include <stdbool.h> +#include <string.h> +#include <inttypes.h> + +#include "cputime.h" + +#define LEN(x) (sizeof((x))/sizeof((x)[0])) +#define BUF_SIZE 40 +#define RANGE_SIZE 188 + +typedef struct { + uint64_t from; + uint64_t to; +} Range; + +int add_range(Range ranges[RANGE_SIZE], Range r, int cur) { + for (int i=0;i<cur;++i) { + if (r.from<=ranges[i].from && r.to>=ranges[i].to) { + ranges[i] = r; + return cur; + } + if (r.from>=ranges[i].from && r.from<=ranges[i].to && r.to>ranges[i].to) { + ranges[i].to = r.to; + return cur; + } + if (r.to>=ranges[i].from && r.to<=ranges[i].to && r.from<ranges[i].from) { + ranges[i].from = r.from; + return cur; + } + if (r.from>=ranges[i].from && r.to<=ranges[i].to) { + return cur; + } + } + ranges[cur++] = r; + return cur; +} + +uint64_t sum_ranges(Range ranges[RANGE_SIZE], int cnt) { + uint64_t sum = 0; + for (int i=0;i<cnt;++i) { + if (ranges[i].from==0 && ranges[i].from==ranges[i].to) continue; + sum += ranges[i].to-ranges[i].from+1; + } + return sum; +} + +int main(void) { + char buf[BUF_SIZE] = {0}; + bool is_ranges = true; + Range ranges[RANGE_SIZE] = {0}; + int cur_range = 0; + int p1 = 0; + while (fgets(buf, sizeof(buf), stdin)) { + if (is_ranges&&strlen(buf)==1) { + is_ranges=false; + continue; + } + if (is_ranges) { + Range r = {0}; + sscanf(buf, "%"PRIu64" - %"PRIu64, &r.from, &r.to); + cur_range = add_range(ranges, r, cur_range); + } else { + uint64_t num = 0; + sscanf(buf, "%"PRIu64, &num); + for (int i=0;i<RANGE_SIZE;++i) { + if (num>=ranges[i].from && num<=ranges[i].to) { + p1++; + break; + } + } + } + } + + // fold ranges + int cnt = RANGE_SIZE; + while (1) { + int cur = 0; + Range ranges1[RANGE_SIZE] = {0}; + for (int i=0;i<cnt;++i) { + if (ranges[i].from==0&&ranges[i].to==0) continue; + cur = add_range(ranges1, ranges[i], cur); + } + memset(ranges, 0, sizeof(ranges)); + memcpy(ranges, ranges1, sizeof(ranges1)); + if (cnt == cur) break; + cnt = cur; + } + + uint64_t p2 = sum_ranges(ranges, cnt); + + printf("p1: %d, p2: %"PRIu64"\n", p1, p2); + return 0; +}