|
|
@@ -6,9 +6,6 @@
|
|
|
#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;
|
|
|
};
|
|
|
@@ -23,8 +20,6 @@ main(int argc, char *argv[])
|
|
|
size_t j = 0;
|
|
|
|
|
|
struct point p = {0};
|
|
|
- struct point *points = NULL;
|
|
|
- size_t points_size = 1;
|
|
|
|
|
|
struct str str_input = {0};
|
|
|
|
|
|
@@ -42,9 +37,16 @@ main(int argc, char *argv[])
|
|
|
|
|
|
str_input = str_from_cstr(raw_input, raw_input_size);
|
|
|
|
|
|
- points = calloc(str_input.size + 1, sizeof(*points));
|
|
|
|
|
|
- {
|
|
|
+ if ( argc == 1 ) {
|
|
|
+ struct point *uniqs = NULL;
|
|
|
+ size_t uniqs_size = 0;
|
|
|
+
|
|
|
+ struct point *points = NULL;
|
|
|
+ size_t points_size = 1;
|
|
|
+
|
|
|
+ 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];
|
|
|
@@ -66,34 +68,99 @@ main(int argc, char *argv[])
|
|
|
}
|
|
|
++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;
|
|
|
+ goto outer_continue_p1;
|
|
|
}
|
|
|
}
|
|
|
uniqs[uniqs_size++] = p;
|
|
|
-outer_continue: ;
|
|
|
+outer_continue_p1: ;
|
|
|
}
|
|
|
|
|
|
res = (long) uniqs_size;
|
|
|
|
|
|
+ free(points);
|
|
|
free(uniqs);
|
|
|
} else {
|
|
|
+ struct point *uniqs = NULL;
|
|
|
+ size_t uniqs_size = 0;
|
|
|
+
|
|
|
+ struct point *rs = NULL;
|
|
|
+ size_t rs_size = 0;
|
|
|
+ struct point *hs = NULL;
|
|
|
+ size_t hs_size = 0;
|
|
|
+
|
|
|
+ /* Need only half of str_points.size, but who cares. */
|
|
|
+ rs = calloc(str_input.size, sizeof(*rs));
|
|
|
+ hs = calloc(str_input.size, sizeof(*hs));
|
|
|
+
|
|
|
+ for ( i = 0; i < str_input.size; ++i ) {
|
|
|
+ struct point *it = NULL;
|
|
|
+ if ( (i & 1) == 0 ) {
|
|
|
+ p = hs[hs_size];
|
|
|
+ it = &hs[(hs_size++) + 1];
|
|
|
+ } else {
|
|
|
+ p = rs[rs_size];
|
|
|
+ it = &rs[(rs_size++) + 1];
|
|
|
+ }
|
|
|
+
|
|
|
+ *it = p;
|
|
|
+ switch ( str_input.data[i] ) {
|
|
|
+ case '>':
|
|
|
+ ++it->x;
|
|
|
+ break;
|
|
|
+ case '^':
|
|
|
+ --it->y;
|
|
|
+ break;
|
|
|
+ case '<':
|
|
|
+ --it->x;
|
|
|
+ break;
|
|
|
+ case 'v':
|
|
|
+ ++it->y;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ uniqs = calloc(rs_size + hs_size, sizeof(*uniqs));
|
|
|
+
|
|
|
+ for ( i = 0; i < str_input.size; ++i ) {
|
|
|
+ if ( i < hs_size ) {
|
|
|
+ p = hs[i];
|
|
|
+ for ( j = 0; j < uniqs_size; ++j ) {
|
|
|
+ if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) {
|
|
|
+ goto not_uniq_1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ uniqs[uniqs_size++] = p;
|
|
|
+not_uniq_1: ;
|
|
|
+ }
|
|
|
+ if ( i < rs_size ) {
|
|
|
+ p = rs[i];
|
|
|
+ for ( j = 0; j < uniqs_size; ++j ) {
|
|
|
+ if ( uniqs[j].x == p.x && uniqs[j].y == p.y ) {
|
|
|
+ goto not_uniq_2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ uniqs[uniqs_size++] = p;
|
|
|
+not_uniq_2: ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ res = (long) uniqs_size;
|
|
|
+
|
|
|
+ free(hs);
|
|
|
+ free(rs);
|
|
|
+
|
|
|
+ free(uniqs);
|
|
|
}
|
|
|
|
|
|
printf("Result: %ld\n", res);
|
|
|
|
|
|
- free(points);
|
|
|
-
|
|
|
free(raw_input);
|
|
|
|
|
|
(void) argc; (void) argv;
|