commit 3e04e6d02f2b8c230f6577f61062e16c11c0ede6
parent 9adecfd73670bbfc70aca2444d0f84bca1552dbc
Author: bsandro <email@bsandro.tech>
Date: Mon, 8 Dec 2025 09:12:17 +0200
day08 mysterious segfault
Diffstat:
| A | day08.c | | | 130 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 130 insertions(+), 0 deletions(-)
diff --git a/day08.c b/day08.c
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <math.h>
+#include <stdbool.h>
+#include <string.h>
+#include <strings.h>
+#include "cputime.h"
+
+#define LEN(x) (sizeof((x))/sizeof(*(x)))
+
+typedef union {
+ struct { int x, y, z; };
+ int n[3];
+} Point;
+
+typedef struct {
+ Point *p1;
+ Point *p2;
+ int d;
+ int id;
+} Distance;
+
+typedef struct {
+ int id;
+ int num;
+} Circuit;
+
+static int btoi(int bufl, int buf[bufl]) {
+ int num = 0;
+ for (int i=0;i<bufl;++i) num = num*10+buf[i];
+ return num;
+}
+
+static int dist(Point p1, Point p2) {
+ return sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2)+pow(p1.z-p2.z,2));
+}
+
+static int cmp_dist(const void *vd1, const void *vd2) {
+ Distance *d1 = (Distance *)vd1;
+ Distance *d2 = (Distance *)vd2;
+ return d1->d - d2->d;
+}
+
+static int find_dist_id(int distsl, const Distance dists[distsl], const Distance *d) {
+ for (int i=0;i<distsl;++i) {
+ if (d==&dists[i]) continue; // skip self
+ Distance di = dists[i];
+ if (d->p1==di.p1||d->p2==di.p2||d->p1==di.p2||d->p2==di.p1) {
+ return di.id;
+ }
+ }
+ return -1;
+}
+
+static bool has_points(int distsl, const Distance dists[distsl], const Point *p1, const Point *p2) {
+ for (int i=0;i<distsl;++i) {
+ if (dists[i].p1==p2&&dists[i].p2==p1) return true;
+ }
+ return false;
+}
+
+static int cmp_cir(const void *vc1, const void *vc2) {
+ return *(int *)(vc2) - *(int *)(vc1);
+}
+
+#define POINTS 1000
+
+int main(void) {
+ uint64_t part1 = 0;
+ uint64_t part2 = 0;
+ //Point *points = malloc(sizeof(Point)*POINTS);
+ Point *points = calloc(POINTS, sizeof(Point));
+ //bzero(points, sizeof(Point)*POINTS);
+ printf("malloc ok\n");
+ exit(0);
+ int pointsl = 0;
+ int *n = points[0].n;
+ int buf[16] = {0};
+ int bufl = 0;
+ for (int c=getchar();c!=EOF;c=getchar()) {
+ if (c>='0'&&c<='9') buf[bufl++] = c-'0';
+ else if (c==','||c=='\n') {
+ *n = btoi(bufl, buf);
+ bufl = 0;
+ n++;
+ if (c=='\n') n = points[++pointsl].n;
+ }
+ }
+ Distance dists[POINTS*POINTS] = {0};
+ int distsl = 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]);
+ //printf("{ x:%3d,y:%3d,z:%3d } -> ", points[i1].x, points[i1].y, points[i1].z);
+ //printf("{ x:%3d,y:%3d,z:%3d } ", points[i2].x, points[i2].y, points[i2].z);
+ //printf("%d\n", d);
+ if (!has_points(distsl, dists, p1, p2)) dists[distsl++] = (Distance){ p1, p2, d, 0 };
+ }
+ }
+ qsort(dists, distsl, sizeof(Distance), cmp_dist);
+ /*for (int i=0;i<distsl;++i) {
+ printf("%p -> %p %d\n", dists[i].p1, dists[i].p2, dists[i].d);
+ }*/
+ int max_id = 0;
+ int cir[15] = {0};
+ for (int i=0;i<10;++i) { // 10 connections for test
+ //for (int d=0;d<distsl;++d) {
+ int id = find_dist_id(distsl, dists, &dists[i]);
+ //printf("found id: %d\n", id);
+ if (id<1) {
+ dists[i].id = ++max_id;
+ cir[max_id] = 2; // initial circuit always has two junction boxes
+ } else {
+ dists[i].id = id;
+ cir[id]++;
+ }
+ //}
+ }
+ qsort(cir, 10, sizeof(int), cmp_cir);
+ for (int i=0;i<15;++i) printf("cir[%2d] = %d\n", i, cir[i]);
+ part2 = cir[0]*cir[1]*cir[2];
+ printf("max_id: %d\n", max_id);
+ printf("cir[0]: %d\n", cir[0]);
+ printf("p1: %"PRIu64"\np2: %"PRIu64"\n", part1, part2);
+ return 0;
+}