From b3066997c551166eada297ad8919fde696414dad Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Wed, 11 Dec 2019 20:19:27 -0500 Subject: Solve day 10 part 1 --- 2019/day10.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 2019/day10.c diff --git a/2019/day10.c b/2019/day10.c new file mode 100644 index 0000000..dbc2352 --- /dev/null +++ b/2019/day10.c @@ -0,0 +1,57 @@ +#include +#include + +static struct Point { + int x, y; +} Point(int x, int y) { + return (struct Point) { x, y }; +} + +static int eq(struct Point a, struct Point b) { + return a.x == b.x && a.y == b.y; +} + +static struct Point sub(struct Point a, struct Point b) { + return Point(a.x - b.x, a.y - b.y); +} + +static struct Point reduce(struct Point p) { + int max = (abs(p.x) > abs(p.y) ? abs(p.x) : abs(p.y)); + for (int i = max; i > 1; --i) { + if (p.x / i * i != p.x) continue; + if (p.y / i * i != p.y) continue; + return Point(p.x / i, p.y / i); + } + return p; +} + +int main(void) { + struct Point ps[2048]; + size_t len = 0; + int y = 0, x = 0; + int ch; + while (EOF != (ch = getchar())) { + switch (ch) { + break; case '.': x++; + break; case '#': ps[len++] = Point(x++, y); + break; case '\n': y++; x = 0; + } + } + + size_t max = 0; + for (size_t i = 0; i < len; ++i) { + struct Point ds[2048]; + size_t dlen = 0; + for (size_t j = 0; j < len; ++j) { + if (j == i) continue; + struct Point a = reduce(sub(ps[j], ps[i])); + size_t d; + for (d = 0; d < dlen; ++d) { + if (eq(ds[d], a)) break; + } + if (d == dlen) ds[dlen++] = a; + } + if (dlen > max) max = dlen; + } + printf("%zu\n", max); +} -- cgit 1.4.1