summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--2019/day10.c57
1 files changed, 57 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+
+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);
+}