summary refs log tree commit diff homepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--2019/day03.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/2019/day03.c b/2019/day03.c
index 5d45bc0..6336ff7 100644
--- a/2019/day03.c
+++ b/2019/day03.c
@@ -10,14 +10,6 @@ struct Line {
 	struct Point a, b;
 };
 
-static void normalize(struct Line *l) {
-	if (l->a.x > l->b.x || l->a.y > l->b.y) {
-		struct Point p = l->a;
-		l->a = l->b;
-		l->b = p;
-	}
-}
-
 static size_t parse(struct Line *lines) {
 	char dir;
 	int dist;
@@ -33,13 +25,22 @@ static size_t parse(struct Line *lines) {
 			break; case 'R': point.x += dist;
 			break; default: abort();
 		}
-		lines[len].b = point;
-		normalize(&lines[len++]);
+		lines[len++].b = point;
 	}
 	return len;
 }
 
+static void normalize(struct Line *l) {
+	if (l->a.x > l->b.x || l->a.y > l->b.y) {
+		struct Point p = l->a;
+		l->a = l->b;
+		l->b = p;
+	}
+}
+
 static int intersect(struct Point *p, struct Line v, struct Line h) {
+	normalize(&v);
+	normalize(&h);
 	if (v.a.x != v.b.x) {
 		struct Line l = v;
 		v = h;
@@ -56,6 +57,10 @@ static int intersect(struct Point *p, struct Line v, struct Line h) {
 	return 1;
 }
 
+static int length(struct Line l) {
+	return abs(l.b.x - l.a.x) + abs(l.b.y - l.a.y);
+}
+
 int main(void) {
 	struct Line aLines[512];
 	struct Line bLines[512];
@@ -73,4 +78,22 @@ int main(void) {
 		}
 	}
 	printf("%d\n", min);
+
+	min = INT_MAX;
+	int aSteps = 0;
+	for (size_t a = 0; a < aLen; ++a) {
+		int bSteps = 0;
+		for (size_t b = 0; b < bLen; ++b) {
+			struct Point p;
+			if (intersect(&p, aLines[a], bLines[b]) && !(!p.x && !p.y)) {
+				int steps = aSteps + bSteps;
+				steps += length((struct Line) { aLines[a].a, p });
+				steps += length((struct Line) { bLines[b].a, p });
+				if (steps < min) min = steps;
+			}
+			bSteps += length(bLines[b]);
+		}
+		aSteps += length(aLines[a]);
+	}
+	printf("%d\n", min);
 }