From be3a5feabe0d97a219bfa0ecac1869075e0c974d Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Tue, 3 Dec 2019 02:02:07 -0500 Subject: Solve day 3 part 2 Dang, I got screwed up by normalizing the lines in place rather than just for the intersection function. When it came to calculating the length of the final segment to the intersection, the "last" point was sometimes the wrong end. --- 2019/day03.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) (limited to '2019/day03.c') 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); } -- cgit 1.4.1