diff options
| author | nekineki <nekineki@nekineki.net> | 2022-12-11 14:47:27 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2022-12-11 14:50:32 +0100 |
| commit | fe75c10e350743a1c078f065d69556fecf825ca5 (patch) | |
| tree | 956556a564c9329346dc9d8b1535dc5e365f3d55 /2022/day8/day8.c | |
| parent | a74d2dc54aef546664bcc8c81eb8e01a93e94391 (diff) | |
move files around, update paths
Diffstat (limited to '2022/day8/day8.c')
| -rw-r--r-- | 2022/day8/day8.c | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/2022/day8/day8.c b/2022/day8/day8.c deleted file mode 100644 index f59322e..0000000 --- a/2022/day8/day8.c +++ /dev/null @@ -1,155 +0,0 @@ -#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"); -} - |
