#include #include #include #define IMP #include "../../file.h" #include "../../str.h" #define BL_MIN(v1, v2) ((((v1) >= (v2)) * (v2)) + (((v1) < (v2)) * (v1))) #define BL_MAX(v1, v2) ((((v1) >= (v2)) * (v1)) + (((v1) < (v2)) * (v2))) struct point { long x, y; }; int main(int argc, char *argv[]) { enum file_err ferr; long res = 0; size_t i = 0; size_t j = 0; struct point p = {0}; struct point *points = NULL; size_t points_size = 1; struct str str_input = {0}; char *raw_input = NULL; size_t raw_input_size = 0; raw_input = (char *) file_read_all("./input.txt", &raw_input_size, &ferr); if ( ferr != FILE_ERR_OK ) { fprintf(stderr, "Failed to open file: %s\n", file_err_to_cstr(ferr)); exit(EXIT_FAILURE); } str_input = str_from_cstr(raw_input, raw_input_size); points = calloc(str_input.size + 1, sizeof(*points)); { for ( i = 0; i < str_input.size; ++i ) { struct point *it = (points + i + 1); p = points[i]; *it = p; switch ( str_input.data[i] ) { case '>': ++it->x; break; case '^': --it->y; break; case '<': --it->x; break; case 'v': ++it->y; break; } ++points_size; } } if ( argc == 1 ) { struct point *uniqs = NULL; size_t uniqs_size = 0; uniqs = calloc(points_size, sizeof(*uniqs)); for ( i = 0; i < points_size; ++i ) { p = points[i]; for ( j = 0; j < uniqs_size; ++j ) { if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) { goto outer_continue; } } uniqs[uniqs_size++] = p; outer_continue: ; } res = (long) uniqs_size; free(uniqs); } else { } printf("Result: %ld\n", res); free(points); free(raw_input); (void) argc; (void) argv; return 0; }