diff options
| author | nekineki <nekineki@nekineki.net> | 2022-12-08 20:58:11 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2022-12-08 20:58:11 +0100 |
| commit | fafea826733e745374f8c297e86c67001b7f1953 (patch) | |
| tree | 653ced97ba017b42c3c0069b4f1194d50065a035 /2022 | |
| parent | 0bc22402954853c684c78517a9d3a208e3086180 (diff) | |
day8 c
Diffstat (limited to '2022')
| -rw-r--r-- | 2022/day8/day8.c | 155 |
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"); +} + |
