diff options
Diffstat (limited to '2019')
-rw-r--r-- | 2019/day03.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/2019/day03.c b/2019/day03.c new file mode 100644 index 0000000..5d45bc0 --- /dev/null +++ b/2019/day03.c @@ -0,0 +1,76 @@ +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> + +struct Point { + int x, y; +}; + +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; + size_t len = 0; + struct Point point = { 0, 0 }; + while (EOF != scanf("%c%d,", &dir, &dist)) { + if (dir == '\n') break; + lines[len].a = point; + switch (dir) { + break; case 'U': point.y += dist; + break; case 'D': point.y -= dist; + break; case 'L': point.x -= dist; + break; case 'R': point.x += dist; + break; default: abort(); + } + lines[len].b = point; + normalize(&lines[len++]); + } + return len; +} + +static int intersect(struct Point *p, struct Line v, struct Line h) { + if (v.a.x != v.b.x) { + struct Line l = v; + v = h; + h = l; + } + if (v.a.y == v.b.y) return 0; + if (h.a.x == h.b.x) return 0; + if (h.a.y < v.a.y) return 0; + if (h.a.y > v.b.y) return 0; + if (h.a.x > v.a.x) return 0; + if (h.b.x < v.a.x) return 0; + p->x = v.a.x; + p->y = h.a.y; + return 1; +} + +int main(void) { + struct Line aLines[512]; + struct Line bLines[512]; + size_t aLen = parse(aLines); + size_t bLen = parse(bLines); + + int min = INT_MAX; + for (size_t a = 0; a < aLen; ++a) { + for (size_t b = 0; b < bLen; ++b) { + struct Point p; + if (!intersect(&p, aLines[a], bLines[b])) continue; + if (!p.x && !p.y) continue; + int dist = abs(p.x) + abs(p.y); + if (dist < min) min = dist; + } + } + printf("%d\n", min); +} |