commit 2823dda5cf87d879d93c5ebf26b146dabeca0d48
parent afb256e15a18d1ae501cfb9162adfdea1b8c584e
Author: bsandro <email@bsandro.tech>
Date: Fri, 5 Dec 2025 08:34:59 +0200
day05
Diffstat:
| A | day05.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;
+}