From 2bf891c41c4613c83d869796cb68793ddb629ab8 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Wed, 13 Dec 2023 23:01:17 +0100 Subject: Added solution for 13 --- 2023/13/13b.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 2023/13/13b.c (limited to '2023/13/13b.c') diff --git a/2023/13/13b.c b/2023/13/13b.c new file mode 100644 index 0000000..090a895 --- /dev/null +++ b/2023/13/13b.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include + +#define N 64 + +#define MAX(a,b) ((a)>(b)?(a):(b)) + +char *buf, line[N]; +int64_t i, s, nc, nr, r[N], c[N]; + +int64_t onebit(int64_t x) { + while (x % 2 == 0) x >>= 1; + return !(x-1); +} + +int64_t issmudgedmirror(int64_t i, int64_t a[], int64_t n) { + int64_t smudge = 0; + for (int64_t j = MAX(0, 2*i-n+2); j <= i && 2*i-j+1 < n; j++) { + if (a[j] == a[2*i-j+1]) continue; + if (onebit(a[j] ^ a[2*i-j+1])) + smudge++; + else + return 0; + } + return smudge == 1; +} + +int main() { + do { + buf = fgets(line, N, stdin); + if (buf == NULL || line[0] == '\n') { + for (i = 0; i < nc-1; i++) + s += (i + 1) * issmudgedmirror(i, c, nc); + for (i = 0; i < nr-1; i++) + s += 100 * (i + 1) * issmudgedmirror(i, r, nr); + nr = nc = 0; + memset(r, 0, N * sizeof(int64_t)); + memset(c, 0, N * sizeof(int64_t)); + } else { + for (nc = 0; line[nc] != '\n'; nc++) { + r[nr] = (r[nr] << 1) + (line[nc] == '#'); + c[nc] = (c[nc] << 1) + (line[nc] == '#'); + } + nr++; + } + } while (buf != NULL); + + printf("%" PRId64 "\n", s); + return 0; +} -- cgit v1.3