advent2025

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

commit 6b2100de96447358c00d365e5448dac30fcb5686
parent e039945a21007f5b26abacb8d08484453121fcc8
Author: bsandro <email@bsandro.tech>
Date:   Tue,  9 Dec 2025 00:16:42 +0200

day08 p2 works though disgusting

Diffstat:
Mday08.c | 42+++++-------------------------------------
1 file changed, 5 insertions(+), 37 deletions(-)

diff --git a/day08.c b/day08.c @@ -48,23 +48,19 @@ static bool has_point(Circuit *cir, const Point *p) { } static void circuits_add(int *cirs_l, Circuit *cirs, Distance *dist) { - //printf("circuits[%d] try add %d -> %d... ", *cirs_l, dist->p1->x, dist->p2->x); for (int i=0;i<*cirs_l;++i) { Circuit *cir = &cirs[i]; bool hit1 = has_point(cir, dist->p1); bool hit2 = has_point(cir, dist->p2); if (hit1&&hit2) { // both points are already in circuit - //printf("circuit %d has both %d and %d\n", cir->id, dist->p1->x, dist->p2->x); return; } else if (hit1||hit2) { // only one of two points found cir->points[cir->points_l++] = hit1?dist->p2:dist->p1; - //printf("add %d to circuit %d\n", hit1?dist->p2->x:dist->p1->x, cir->id); return; } } int cir_id = (*cirs_l)++; - //printf("circuits_add(%d) %d, %d\n", cir_id, dist->p1->x, dist->p2->x); Circuit *cir = &cirs[cir_id]; cir->id = cir_id; cir->points[cir->points_l++] = dist->p1; @@ -112,7 +108,7 @@ void points_print(int points_l, Point *points[points_l]) { printf("\n"); } -static int circuits_merge(int circuits_l, Circuit circuits[]) { +static int circuits_merge(int circuits_l, Circuit *circuits) { int new_len = circuits_l; for (int i=0;i<circuits_l;++i) { Circuit *cir1 = &circuits[i]; @@ -122,22 +118,23 @@ static int circuits_merge(int circuits_l, Circuit circuits[]) { if (circuits_overlap(cir1, cir2)) { circuit_merge(cir1, cir2); new_len--; + break; } } } + qsort(circuits, circuits_l, sizeof(Circuit), cmp_circuits); return new_len; } #define POINTS 1000 #define CONNS 1000 //#define POINTS 20 -//#define CONNS 10 +//b#define CONNS 10 int main(void) { uint64_t part1 = 0; uint64_t part2 = 0; Point *points = calloc(POINTS, sizeof(Point)); - printf("malloc ok\n"); int points_l = 0; int *n = points[0].n; int buf[16] = {0}; @@ -151,10 +148,8 @@ int main(void) { if (c=='\n') n = points[++points_l].n; } } - printf("%d points\n", points_l); const int dists_cnt = (POINTS*POINTS-POINTS)/2; Distance *dists = calloc(dists_cnt, sizeof(Distance)); - printf("%d dists\n", dists_cnt); int dists_l = 0; for (size_t i1=0;i1<POINTS;++i1) { for (size_t i2=0;i2<POINTS;++i2) { @@ -167,44 +162,19 @@ int main(void) { } } } - printf("%d dists real\n", dists_l); qsort(dists, dists_l, sizeof(Distance), cmp_dist); - /*for (int i=0;i<dists_l;++i) { - printf("%3d -> %3d (%3d)\n", dists[i].p1->x, dists[i].p2->x, dists[i].d); - if (dists[i].p1->x==216 && dists[i].p2->x==117) { - printf("fin\n"); - break; - } - }*/ Circuit *circuits = calloc(CONNS*2, sizeof(Circuit)); int circuits_l = 0; - printf("Circuits: %zu/%zu\n", sizeof(circuits), sizeof(Circuit)); for (int i=0;i<CONNS;++i) { circuits_add(&circuits_l, circuits, &dists[i]); - //printf("cir_id: %d (%d -> %d) (max: %d)\n", cir_id, dists[i].p1->x, dists[i].p2->x, max_id); - } - printf("circuits_l: %d\n", circuits_l); - for (int i=0;i<10;++i) { - printf("circuit[%2d] = %2d: ", i, circuits[i].points_l); - points_print(circuits[i].points_l, circuits[i].points); } int len_prev = circuits_l; while (1) { - //printf("\nMERGE %d circuits\n", circuits_l); circuits_l = circuits_merge(circuits_l, circuits); if (circuits_l==len_prev) break; len_prev = circuits_l; } - for (int i=0;i<10;++i) { - printf("circuit[%2d] = %2d: ", circuits[i].id, circuits[i].points_l); - points_print(circuits[i].points_l, circuits[i].points); - } qsort(circuits, circuits_l, sizeof(Circuit), cmp_circuits); - printf("\nSORT\n"); - for (int i=0;i<10;++i) { - printf("circuit[%2d] = %2d: ", circuits[i].id, circuits[i].points_l); - points_print(circuits[i].points_l, circuits[i].points); - } part1 = circuits[0].points_l*circuits[1].points_l*circuits[2].points_l; // ------------------------------------ free(circuits); @@ -219,13 +189,11 @@ int main(void) { else len_prev = circuits_l; } if (circuits[0].points_l==points_l) { - printf("final dist: %d -> %d\n", dists[i].p1->x, dists[i].p2->x); part2 = dists[i].p1->x * dists[i].p2->x; break; } } - printf("final circuits_l: %d (%d)\n", circuits_l, circuits[0].points_l); + printf("p1: %"PRIu64"\np2: %"PRIu64"\n", part1, part2); return 0; } -// p2 8168085134 too low