advent2025

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

commit 3e04e6d02f2b8c230f6577f61062e16c11c0ede6
parent 9adecfd73670bbfc70aca2444d0f84bca1552dbc
Author: bsandro <email@bsandro.tech>
Date:   Mon,  8 Dec 2025 09:12:17 +0200

day08 mysterious segfault

Diffstat:
Aday08.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; +}