commit 6b2100de96447358c00d365e5448dac30fcb5686
parent e039945a21007f5b26abacb8d08484453121fcc8
Author: bsandro <email@bsandro.tech>
Date: Tue, 9 Dec 2025 00:16:42 +0200
day08 p2 works though disgusting
Diffstat:
| M | day08.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