commit 53314f3614e0e12b364ae7e48a061255fe2f3d98
parent b4766bd83a5a6a8673e34578a6ca93bfe0ea424c
Author: bsandro <email@bsandro.tech>
Date: Wed, 10 Dec 2025 01:45:39 +0200
day09 p2 works
Diffstat:
| M | day09.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