瀏覽代碼

[C][2015][Day_3] Adding Naive Solution for Part 2

Vinicius Teshima 1 年之前
父節點
當前提交
0bb784388f
共有 1 個文件被更改,包括 82 次插入15 次删除
  1. 82 15
      C/2015/Day_3/main.c

+ 82 - 15
C/2015/Day_3/main.c

@@ -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;