advent2025

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

commit 53314f3614e0e12b364ae7e48a061255fe2f3d98
parent b4766bd83a5a6a8673e34578a6ca93bfe0ea424c
Author: bsandro <email@bsandro.tech>
Date:   Wed, 10 Dec 2025 01:45:39 +0200

day09 p2 works

Diffstat:
Mday09.c | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 53 insertions(+), 12 deletions(-)

diff --git a/day09.c b/day09.c @@ -20,7 +20,7 @@ typedef struct { } Line; static int64_t square(Point p1, Point p2) { - return llabs((p1.x-p2.x)+1) * llabs((p1.y-p2.y)+1); + return (llabs(p1.x-p2.x)+1) * (llabs(p1.y-p2.y)+1); } static int btoi(int bufl, int buf[bufl]) { @@ -43,12 +43,18 @@ static bool square_has_points(int points_l, Point points[points_l], Point p1, Po int maxy = MAX(p1.y, p2.y); for (int i=0;i<points_l;++i) { Point p = points[i]; - if (p.x<maxx&&p.x>minx&&p.y<maxy&&p.y>miny) return true; + if ((p.x==p1.x&&p.y==p1.y)||(p.x==p2.x&&p.y==p2.y)) continue; // skip self + if (p.x<maxx&&p.x>minx&&p.y<maxy&&p.y>miny) { + //if (p1.x==9&&p1.y==5&&p2.x==2&&p2.y==3) printf("square_has_points failed\n"); + return true; + } } + //if (p1.x==9&&p1.y==5&&p2.x==2&&p2.y==3) printf("square_has_points succeeded\n"); + return false; } -static bool lines_have_point(int lines_l, Line lines[lines_l], Point p) { +static bool __attribute__((unused)) lines_have_point(int lines_l, Line lines[lines_l], Point p) { for (int i=0;i<lines_l;++i) { Point p1 = lines[i].p1; Point p2 = lines[i].p2; @@ -65,14 +71,14 @@ static bool __attribute__((unused)) lines_have_point1(int lines_l, Line lines[li for (int i=0;i<lines_l;++i) { Point p1 = lines[i].p1; Point p2 = lines[i].p2; + int miny = MIN(p1.y, p2.y); + int maxy = MAX(p1.y, p2.y); + int minx = MIN(p1.x, p2.x); + int maxx = MAX(p1.x, p2.x); if (p1.x==p2.x&&p1.x==p.x) { - int miny = MIN(p1.y, p2.y); - int maxy = MAX(p1.y, p2.y); if (p.y>=miny&&p.y<=maxy) return true; } if (p1.y==p2.y&&p1.y==p.y) { - int minx = MIN(p1.x, p2.x); - int maxx = MAX(p1.x, p2.x); if (p.x>=minx&&p.x<=maxx) return true; } } @@ -92,10 +98,45 @@ static bool point_is_inside(int lines_l, Line lines[lines_l], int maxx, Point p) return num%2==1; } -static bool square_valid(int lines_l, Line lines[lines_l], int maxx, Point p1, Point p2) { +static bool square_is_valid(int lines_l, Line lines[lines_l], int maxx, Point p1, Point p2) { Point p3 = (Point){ .x=p1.x, .y=p2.y }; Point p4 = (Point){ .x=p2.x, .y=p1.y }; - return (point_is_inside(lines_l, lines, maxx, p3) && point_is_inside(lines_l, lines, maxx, p4)); + (void)maxx; + (void)point_is_inside; + int x1 = MIN(p1.x, p2.x); + int x2 = MAX(p1.x, p2.x); + int y1 = MIN(p1.y, p2.y); + int y2 = MAX(p1.y, p2.y); + for (int i=0;i<lines_l;++i) { + Line l = lines[i]; + if (l.p1.x==p1.x&&l.p1.y==p1.y&&l.p2.x==p2.x&&l.p2.y==p2.y) continue; // skip self + int lx1 = MIN(l.p1.x, l.p2.x); + int lx2 = MAX(l.p1.x, l.p2.x); + int ly1 = MIN(l.p1.y, l.p2.y); + int ly2 = MAX(l.p1.y, l.p2.y); + if ((p3.x==lx1&&p3.y==ly1)|| + (p3.x==lx2&&p3.y==ly2)|| + (p4.x==lx1&&p4.y==ly1)|| + (p4.x==lx2&&p4.y==ly2)|| + + (p1.x==lx1&&p1.y==ly1)|| + (p1.x==lx2&&p1.y==ly2)|| + (p2.x==lx1&&p2.y==ly1)|| + (p2.x==lx2&&p2.y==ly2) + ) continue; + if (lx1<=x1&&lx2>=x2&&ly1>=y1&&ly2<=y2) { + //printf("square_is_valid %d,%d->%d,%d check 1 failed: lx1:%d,ly1:%d,lx2:%d,ly2:%d; line %d:%d->%d:%d\n",p1.x,p1.y,p2.x,p2.y,lx1,ly1,lx1,ly2,l.p1.x,l.p1.y,l.p2.x,l.p2.y); + return false; + } + if (ly1<=y1&&ly2>=y2&&lx1>=x1&&lx2<=x2) { + //printf("square_is_valid %d,%d->%d,%d check 2 failed: lx1:%d,ly1:%d,lx2:%d,ly2:%d; line %d:%d->%d:%d\n",p1.x,p1.y,p2.x,p2.y,lx1,ly1,lx1,ly2,l.p1.x,l.p1.y,l.p2.x,l.p2.y); + return false; + } + } + //return (point_is_inside(lines_l, lines, maxx, p3) && point_is_inside(lines_l, lines, maxx, p4)); + //if (p1.x==9&&p1.y==5&&p2.x==2&&p2.y==3) printf("square_is_valid succeeded\n"); + + return true; } static int get_max_x(int points_l, Point points[points_l]) { @@ -148,10 +189,11 @@ int main(void) { int64_t sq = square(points[i], points[j]); squares[squares_l++] = sq; //printf("----------------------\n"); + //if (points[i].x==9&&points[i].y==5&&points[j].x==2&&points[j].y==3) printf("checking...\n"); if (!square_has_points(points_l, points, points[i], points[j]) && - square_valid(lines_l, lines, maxx, points[i], points[j])) { + square_is_valid(lines_l, lines, maxx, points[i], points[j])) { squares2[squares2_l++] = sq; - //printf("square %d,%d->%d,%d valid %lu\n", points[i].x,points[i].y, points[j].x,points[j].y,sq); + //printf("square %2d,%2d->%2d,%2d valid %lu\n", points[i].x,points[i].y, points[j].x,points[j].y,sq); } } } @@ -165,4 +207,3 @@ int main(void) { printf("p1: %"PRIi64"\np2: %"PRIi64"\n", part1, part2); return 0; } -// 1433117952 too low