commit e039945a21007f5b26abacb8d08484453121fcc8
parent f9e0572f8dac8018300e00fa159888c71d8390bc
Author: bsandro <brian.drosan@gmail.com>
Date: Tue, 9 Dec 2025 00:01:31 +0200
day08 p2 doesn't work yet
Diffstat:
| M | day08.c | | | 51 | +++++++++++++++++++++++++++++++++++++++------------ |
1 file changed, 39 insertions(+), 12 deletions(-)
diff --git a/day08.c b/day08.c
@@ -138,7 +138,7 @@ int main(void) {
uint64_t part2 = 0;
Point *points = calloc(POINTS, sizeof(Point));
printf("malloc ok\n");
- int pointsl = 0;
+ int points_l = 0;
int *n = points[0].n;
int buf[16] = {0};
int bufl = 0;
@@ -148,27 +148,34 @@ int main(void) {
*n = btoi(bufl, buf);
bufl = 0;
n++;
- if (c=='\n') n = points[++pointsl].n;
+ if (c=='\n') n = points[++points_l].n;
}
}
- printf("%d points\n", pointsl);
- Distance *dists = calloc((POINTS*POINTS-POINTS)/2, sizeof(Distance));
- printf("%d dists\n", (POINTS*POINTS-POINTS)/2);
- int dicts_l = 0;
+ 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) {
if (i1==i2) continue;
Point *p1 = &points[i1];
Point *p2 = &points[i2];
int d = dist(points[i1], points[i2]);
- if (!has_points(dicts_l, dists, p1, p2)) {
- dists[dicts_l++] = (Distance){ p1, p2, d };
+ if (!has_points(dists_l, dists, p1, p2)) {
+ dists[dists_l++] = (Distance){ p1, p2, d };
}
}
}
- printf("%d dists real\n", dicts_l);
- qsort(dists, dicts_l, sizeof(Distance), cmp_dist);
- for (int i=0;i<11;++i) printf("%3d -> %3d (%3d)\n", dists[i].p1->x, dists[i].p2->x, dists[i].d);
+ 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));
@@ -183,7 +190,7 @@ int main(void) {
}
int len_prev = circuits_l;
while (1) {
- printf("\nMERGE %d circuits\n", circuits_l);
+ //printf("\nMERGE %d circuits\n", circuits_l);
circuits_l = circuits_merge(circuits_l, circuits);
if (circuits_l==len_prev) break;
len_prev = circuits_l;
@@ -199,6 +206,26 @@ int main(void) {
points_print(circuits[i].points_l, circuits[i].points);
}
part1 = circuits[0].points_l*circuits[1].points_l*circuits[2].points_l;
+ // ------------------------------------
+ free(circuits);
+ circuits = calloc(dists_l, sizeof(Circuit));
+ circuits_l = 0;
+ for (int i=0;i<dists_l;++i) {
+ circuits_add(&circuits_l, circuits, &dists[i]);
+ int len_prev = circuits_l;
+ while (1) {
+ circuits_l = circuits_merge(circuits_l, circuits);
+ if (circuits_l==len_prev) break;
+ 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