summaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authornekineki <nekineki@nekineki.net>2022-12-08 20:58:11 +0100
committernekineki <nekineki@nekineki.net>2022-12-08 20:58:11 +0100
commitfafea826733e745374f8c297e86c67001b7f1953 (patch)
tree653ced97ba017b42c3c0069b4f1194d50065a035 /2022
parent0bc22402954853c684c78517a9d3a208e3086180 (diff)
day8 c
Diffstat (limited to '2022')
-rw-r--r--2022/day8/day8.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/2022/day8/day8.c b/2022/day8/day8.c
new file mode 100644
index 0000000..f59322e
--- /dev/null
+++ b/2022/day8/day8.c
@@ -0,0 +1,155 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "../util.h"
+
+s32 reduce(s32 (*f)(s32 x, s32 y), s32 arr[], s32 len)
+{
+ s32 ret = arr[0];
+
+ for (s32 i = 1; i < len; ++i) {
+ ret = f(ret, arr[i]);
+ }
+
+ return ret;
+}
+
+s32 mul(s32 x, s32 y)
+{
+ return x * y;
+}
+
+s32 max(s32 x, s32 y)
+{
+ return x > y ? x : y;
+}
+
+s32 count_char_in_string(char c, char *s)
+{
+ s32 count = 0;
+ do
+ if (c == *s)
+ count++;
+ while (*s++);
+ return count;
+}
+
+char *goto_char_in_string(char c, char *s)
+{
+ do
+ if (c == *s)
+ return s;
+ while (*s++);
+ return NULL;
+}
+
+#define PP(arr, y,x) *(*(arr+y)+x)
+
+// char filename[] = "ref.txt";
+char filename[] = "pzl.txt";
+
+#define BUF_LEN 10000
+char file_buf[BUF_LEN];
+
+int main()
+{
+ int fd = open(filename, O_RDONLY);
+ s32 data_len = read(fd, file_buf, LEN(file_buf));
+
+ if (data_len == -1) {
+ printf("error opening file\n");
+ exit(1);
+ } else if (data_len == LEN(file_buf)) {
+ printf("buffer probably not big enough\n");
+ exit(1);
+ }
+ file_buf[data_len] = '\0';
+
+ s32 y_len = count_char_in_string('\n', file_buf);
+ s32 x_len;
+ // printf("y_len: %d\n", y_len);
+
+ s32 **arr = malloc(y_len * sizeof(s32*));
+ s32 **flag = malloc(y_len * sizeof(s32*));
+ char *start = file_buf;
+ for (s32 i = 0; i < y_len; ++i) {
+ char *end = goto_char_in_string('\n', start);
+ x_len = end - start;
+ // printf("x_len: %d\n", x_len);
+
+ *(arr+i) = malloc(x_len * sizeof(s32*));
+ *(flag+i) = malloc(x_len * sizeof(s32*));
+
+ for (s32 j = 0; j < x_len; ++j) {
+ *(*(arr+i) + j) = *(start + j) - '0';
+ *(*(flag+i) + j) = 0;
+ }
+ start = end+1;
+ }
+
+
+ s32 res1 = 0;
+ s32 maxval;
+
+#define RES1_CHECK() \
+ if (PP(arr, y, x) > maxval) { \
+ maxval = PP(arr, y, x); \
+ if (PP(flag, y, x) == 0) { \
+ PP(flag, y, x) = 1; \
+ res1 += 1; \
+ } \
+ }
+
+ for (s32 y = 0; y < y_len; ++y) {
+ maxval = -1;
+ for (s32 x = 0; x < x_len; ++x)
+ RES1_CHECK();
+ maxval = -1;
+ for (s32 x = x_len-1; x >= 0 ; --x)
+ RES1_CHECK();
+ }
+ for (s32 x = 0; x < x_len; ++x) {
+ maxval = -1;
+ for (s32 y = 0; y < y_len; ++y)
+ RES1_CHECK();
+ maxval = -1;
+ for (s32 y = y_len-1; y >= 0 ; --y)
+ RES1_CHECK();
+ }
+
+
+ s32 res2 = 0;
+ for (s32 y = 0; y < y_len; ++y) {
+ for (s32 x = 0; x < x_len; ++x) {
+
+ s32 rldu[4] = {0};
+ for (s32 r = x+1; r < x_len; ++r)
+ if ((PP(arr,y,r) >= PP(arr,y,x)) || (r==(x_len-1))) {
+ rldu[0] += r-x;
+ break;
+ }
+ for (s32 l = x-1; l >= 0; --l)
+ if ((PP(arr,y,l) >= PP(arr,y,x)) || (l==0)) {
+ rldu[1] += x-l;
+ break;
+ }
+ for (s32 d = y+1; d < y_len; ++d)
+ if ((PP(arr,d,x) >= PP(arr,y,x)) || (d==(y_len-1))) {
+ rldu[2] += d-y;
+ break;
+ }
+ for (s32 u = y-1; u >= 0; --u)
+ if ((PP(arr,u,x) >= PP(arr,y,x)) || (u==0)) {
+ rldu[3] += y-u;
+ break;
+ }
+ res2 = max(res2, reduce(mul, rldu, LEN(rldu)));
+ }
+ }
+
+ printf("res1: %d\n", res1);
+ printf("res2: %d\n", res2);
+ // asm("int3");
+}
+