| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #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;
- }
|