aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Voss <thomasvoss@live.com> 2021-12-05 10:37:21 +0100
committerThomas Voss <thomasvoss@live.com> 2021-12-05 10:37:21 +0100
commit2e28981207430301b54d4d74ee620d0f159f4d8b (patch)
tree5f6af101fd4ee09b16f6f9fdc9e9f002c69bf6ed
parent29fce7fa2a01fe00543e317514e505b4b6524c2b (diff)
Add day 3 solutions
-rw-r--r--2017/03/Makefile6
-rw-r--r--2017/03/input1
-rw-r--r--2017/03/puzzle-1.c50
-rwxr-xr-x2017/03/puzzle-2.awk38
4 files changed, 95 insertions, 0 deletions
diff --git a/2017/03/Makefile b/2017/03/Makefile
new file mode 100644
index 0000000..fd82d57
--- /dev/null
+++ b/2017/03/Makefile
@@ -0,0 +1,6 @@
+all:
+ ${CC} ${CFLAGS} -o puzzle-1 puzzle-1.c
+
+.PHONY: clean
+clean:
+ rm -f puzzle-1
diff --git a/2017/03/input b/2017/03/input
new file mode 100644
index 0000000..e079a50
--- /dev/null
+++ b/2017/03/input
@@ -0,0 +1 @@
+265149
diff --git a/2017/03/puzzle-1.c b/2017/03/puzzle-1.c
new file mode 100644
index 0000000..00cebd7
--- /dev/null
+++ b/2017/03/puzzle-1.c
@@ -0,0 +1,50 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define ODD(x) (x & 1)
+#define MOVE(x) \
+ do { \
+ for (int k = 0; k < j; k++) { \
+ x; \
+ if (++m == n) \
+ goto out; \
+ } \
+ } while (0)
+
+int
+main(void)
+{
+ int n, x, y;
+ FILE *fp;
+
+ if (!(fp = fopen("input", "r")))
+ err(EXIT_FAILURE, "fopen");
+
+ fscanf(fp, "%d", &n);
+ fclose(fp);
+
+ x = y = 0;
+ for (int i = 1, m = 1, j = 1; i < n; i++) {
+ if (ODD(i)) {
+ if (ODD(j))
+ MOVE(x++);
+ else
+ MOVE(x--);
+ } else {
+ if (ODD(j))
+ MOVE(y++);
+ else
+ MOVE(y--);
+ j++;
+ }
+ }
+out:
+ if (x < 0)
+ x = -x;
+ if (y < 0)
+ y = -y;
+
+ printf("%d\n", x + y);
+ return EXIT_SUCCESS;
+}
diff --git a/2017/03/puzzle-2.awk b/2017/03/puzzle-2.awk
new file mode 100755
index 0000000..0758658
--- /dev/null
+++ b/2017/03/puzzle-2.awk
@@ -0,0 +1,38 @@
+#!/usr/bin/env -S awk -f
+
+function move(xi, yi)
+{
+ for (k = 0; k < j; k++) {
+ if (xi)
+ x += xi
+ else
+ y += yi
+
+ spiral[y][x] = spiral[y][x - 1] + spiral[y][x + 1] + spiral[y + 1][x + 1] \
+ + spiral[y + 1][x] + spiral[y + 1][x - 1] + spiral[y - 1][x + 1] \
+ + spiral[y - 1][x] + spiral[y - 1][x - 1]
+ if (spiral[y][x] > n)
+ return spiral[y][x]
+ }
+ return 0
+}
+
+{ n = $1 }
+
+END {
+ spiral[0][0] = 1
+ x = y = 0
+ j = 1
+ for (i = 1; 1; i++) {
+ if (i % 2)
+ if (r = move(j % 2 ? 1 : -1, 0))
+ break
+ else {
+ if (r = move(0, j % 2 ? 1 : -1))
+ break
+ j++
+ }
+ }
+
+ print r
+}