diff options
author | June McEnroe <june@causal.agency> | 2019-12-03 02:02:07 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-11-22 00:14:26 -0500 |
commit | be3a5feabe0d97a219bfa0ecac1869075e0c974d (patch) | |
tree | 8994fe50aaea633c2fb2793e9a3bc403dcb3bdc5 | |
parent | Solve day 3 part 1 (diff) | |
download | aoc-be3a5feabe0d97a219bfa0ecac1869075e0c974d.tar.gz aoc-be3a5feabe0d97a219bfa0ecac1869075e0c974d.zip |
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.
Diffstat (limited to '')
-rw-r--r-- | 2019/day03.c | 43 |
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); } |