Day5 part2 done

This commit is contained in:
2025-12-05 16:33:15 +02:00
parent 8a5e727743
commit c16284029c
2 changed files with 189 additions and 2 deletions

BIN
day5/main

Binary file not shown.

View File

@@ -141,6 +141,193 @@ i64 part1() {
}
i64 part2() {
Range* ranges = malloc(100000);
i32 rlen = 0;
while (get_line()) {
if (*buf == '\n') break;
i32 len = 0;
i64 min = get_num(buf, &len);
buf += len;
if (*buf != '-') {
debug("WEIRD!");
}
buf++;
i64 max = get_num(buf, &len);
ranges[rlen] = (Range){ .min = min, .max = max };
debug("%ld: %ld-%ld\n", rlen, ranges[rlen].min, ranges[rlen].max);
rlen++;
}
i64 count = 0;
Range* dranges = malloc(100000);
i32 dlen = 0;
i32 initialLen = rlen;
i32 overlaps = 0;
i32 subsets = 0;
i32 supersets = 0;
i32 slidingLeft = 0;
i32 slidingRight = 0;
for (i32 i = 0; i < rlen; i++) {
Range range = ranges[i];
bool overlapped = false;
for (i32 j = 0; j < dlen; j++) {
Range drange = dranges[j];
if (drange.max < range.min) {
continue;
}
if (range.max < drange.min) {
continue;
}
overlapped = true;
if (drange.min <= range.min && range.max <= drange.max) {
// Fully contained (no need to add this), can skip
// debug("RANGE %ld-%ld (%ld) [[is subset of]] DRANGE %ld-%ld (%ld)\n",
// range.min, range.max, range.max-range.min,
// drange.min, drange.max, drange.max-drange.min);
subsets++;
break;
// We can break instead of continue, bcz if it's within an existing range
// then there is no point in counting it at all, it's already full counted
}
if (range.min <= drange.min && drange.max <= range.max) {
supersets++;
Range left = (Range){ .min = range.min, .max = drange.min-1 };
Range right = (Range){ .min = drange.max+1, .max = range.max };
if (range.min != drange.min) {
ranges[rlen] = left;
rlen++;
}
if (range.max != drange.max) {
ranges[rlen] = right;
rlen++;
}
debug("SPLIT ");
break;
}
else if (range.max > drange.min && range.min < drange.min) {
slidingLeft++;
// Range leftRange = (Range){ .min = range.min, .max = drange.max-1 };
// // Add new range for rechecking
// debug("HUH\n");
// ranges[rlen] = leftRange;
// rlen++;
// break;
// Range rightRange = (Range){ .min = drange.max+1, .max = range.max };
Range leftRange = (Range){ .min = range.min, drange.min-1 };
// Range leftRange = (Range){ .min = drange.max+1, .max = range.max };
debug("SLIDING LEFT %ld-%ld overlaps DRANGE %ld-%ld producing LRANGE %ld-%ld\n",
range.min, range.max,
drange.min, drange.max,
leftRange.min, leftRange.max);
ranges[rlen] = leftRange;
rlen++;
break;
} else if (range.min < drange.max && drange.min < range.min) {
slidingRight++;
// Range leftRange = (Range){ .min = range.min, drange.min-1 };
Range rightRange = (Range){ .min = drange.max+1, .max = range.max };
// Range rightRange = (Range){ .min = range.min, drange.min-1 };
// debug("SLIDING RIGHT %s RANGE %ld-%ld (%ld) overlaps with DRANGE %ld-%ld (%ld)\n",
// i > initialLen ? "[[NEW]]" : "",
// range.min, range.max, range.max-range.min,
// drange.min, drange.max, drange.max-drange.min);
debug("SLIDING RIGHT %ld-%ld overlaps DRANGE %ld-%ld producing RRANGE %ld-%ld\n",
range.min, range.max,
drange.min, drange.max,
rightRange.min, rightRange.max);
ranges[rlen] = rightRange;
rlen++;
// debug("RIGHT ");
break;
} else if (range.max == drange.min) {
Range r = (Range){ .min = range.min, .max = range.max-1 };
debug("TOUCHING UPPER %ld-%ld overlaps DRANGE %ld-%ld producing RRANGE %ld-%ld\n",
range.min, range.max,
drange.min, drange.max,
r.min, r.max);
ranges[rlen] = r;
rlen++;
} else if (range.min == drange.max) {
Range r = (Range){ .min = range.min+1, .max = range.max };
debug("TOUCHING LOWER %ld-%ld overlaps DRANGE %ld-%ld producing RRANGE %ld-%ld\n",
range.min, range.max,
drange.min, drange.max,
r.min, r.max);
ranges[rlen] = r;
rlen++;
} else {
debug("HUH\n");
debug("RANGE %ld-%ld overlaps DRANGE %ld-%ld\n",
range.min, range.max,
drange.min, drange.max);
*((volatile void*)0);
return -1;
}
overlaps++;
// debug("%s RANGE %ld-%ld (%ld) overlaps with DRANGE %ld-%ld (%ld)\n",
// rlen > initialLen ? "[[NEW]]" : "",
// range.min, range.max, range.max-range.min,
// drange.min, drange.max, drange.max-drange.min);
}
if (!overlapped) {
i64 diff = range.max - range.min;
count += diff+1; // +1 bcz 1-3 is 3-1=2 but 1, 2, 3 is 3, we need to add an extra one
debug("Added drange: %ld-%ld\n", range.min, range.max);
dranges[dlen] = range;
dlen++;
}
}
debug("Overlaps: %d\n", overlaps);
debug("Subsets: %d\n", subsets);
debug("Supersets: %d\n", supersets);
debug("Sliding Left: %d\n", slidingLeft);
debug("Sliding Right: %d\n", slidingRight);
debug("\nCount: %d\n", count);
count = 0;
for (i32 i = 0;i < dlen; i++) {
Range range = dranges[i];
i64 diff = range.max-range.min;
// debug("%ld-%ld (%ld+1)\n", range.min, range.max, diff);
count += diff + 1;
// debug("%d COUNT: %ld\n", i, count);
}
return count;
}
int main() {
@@ -149,8 +336,8 @@ int main() {
buf = malloc(SIZE);
memset(buf, 0, SIZE);
i64 result = part1();
// i64 result = part2();
// i64 result = part1();
i64 result = part2();
printf("\n%ld\n", result);
}