From 2e28981207430301b54d4d74ee620d0f159f4d8b Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Sun, 5 Dec 2021 10:37:21 +0100 Subject: Add day 3 solutions --- 2017/03/Makefile | 6 ++++++ 2017/03/input | 1 + 2017/03/puzzle-1.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2017/03/puzzle-2.awk | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 2017/03/Makefile create mode 100644 2017/03/input create mode 100644 2017/03/puzzle-1.c create mode 100755 2017/03/puzzle-2.awk 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 +#include +#include + +#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 +} -- cgit v1.2.3