|
@@ -0,0 +1,101 @@
|
|
|
|
|
+#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;
|
|
|
|
|
+}
|