Added part 2.
This commit is contained in:
		
							
								
								
									
										122
									
								
								2022/9/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								2022/9/main.cpp
									
									
									
									
									
								
							| @@ -6,13 +6,39 @@ | ||||
| #include <unistd.h> | ||||
| #include <vector> | ||||
|  | ||||
| void DebugPrint(std::pair<int, int> &head, std::pair<int, int> &tail, | ||||
|                 std::set<std::pair<int, int> > &visited_positions) | ||||
| void ApplyMovement(std::pair<int, int> &head, | ||||
|                    std::pair<int, int> &tail) | ||||
| { | ||||
| 	int x_min = head.first; | ||||
| 	int y_min = head.second; | ||||
| 	int x_max = head.first; | ||||
| 	int y_max = head.second; | ||||
| 	const int x_diff = head.first - tail.first; | ||||
| 	const int y_diff = head.second - tail.second; | ||||
| 	if(std::abs(x_diff) > 1) // 2 away | ||||
| 	{ | ||||
| 		tail.first += (head.first - tail.first) / 2; | ||||
| 		if(std::abs(y_diff) > 1) // 2 away due to diagonally following!!! | ||||
| 			tail.second += (head.second - tail.second) / 2; | ||||
| 		else | ||||
| 			// snap to axis since you're already on it or you're one away | ||||
| 			tail.second = head.second; | ||||
| 	} | ||||
| 	if(std::abs(y_diff) > 1) // 2 away | ||||
| 	{ | ||||
| 		tail.second += (head.second - tail.second) / 2; | ||||
| 		if(std::abs(x_diff) > 1) // 2 away due to diagonally following!!! | ||||
| 			tail.first += (head.first - tail.first) / 2; | ||||
| 		else | ||||
| 			// snap to axis since you're already on it or you're one away | ||||
| 			tail.first = head.first; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void DebugPrint(std::vector<std::pair<int, int> > &points, | ||||
|                 std::set<std::pair<int, int> > &visited_positions, | ||||
|                 std::set<std::pair<int, int> > &visited_positions_part2) | ||||
| { | ||||
| 	int x_min = points[0].first; | ||||
| 	int y_min = points[0].second; | ||||
| 	int x_max = points[0].first; | ||||
| 	int y_max = points[0].second; | ||||
|  | ||||
| 	for(auto &pos : visited_positions) | ||||
| 	{ | ||||
| @@ -21,6 +47,13 @@ void DebugPrint(std::pair<int, int> &head, std::pair<int, int> &tail, | ||||
| 		y_min = std::min(y_min, pos.second); | ||||
| 		y_max = std::max(y_max, pos.second); | ||||
| 	} | ||||
| 	for(auto &pos : visited_positions_part2) | ||||
| 	{ | ||||
| 		x_min = std::min(x_min, pos.first); | ||||
| 		x_max = std::max(x_max, pos.first); | ||||
| 		y_min = std::min(y_min, pos.second); | ||||
| 		y_max = std::max(y_max, pos.second); | ||||
| 	} | ||||
|  | ||||
| 	for(auto i = 0; i < 50; ++i) | ||||
| 		std::cout << std::endl; | ||||
| @@ -32,12 +65,30 @@ void DebugPrint(std::pair<int, int> &head, std::pair<int, int> &tail, | ||||
| 	{ | ||||
| 		for(auto x = x_min; x <= x_max; ++x) | ||||
| 		{ | ||||
| 			if(head.first == x && head.second == y) | ||||
| 			if(points[0].first == x && points[0].second == y) | ||||
| 				std::cout << "\033[1;30mH"; // head | ||||
| 			else if(tail.first == x && tail.second == y) | ||||
| 				std::cout << "\033[1;25mT"; // head | ||||
| 			else if(points[1].first == x && points[1].second == y) | ||||
| 				std::cout << "\033[1;25m1"; // tail | ||||
| 			else if(points[2].first == x && points[2].second == y) | ||||
| 				std::cout << "\033[1;25m2"; // tail | ||||
| 			else if(points[3].first == x && points[3].second == y) | ||||
| 				std::cout << "\033[1;25m3"; // tail | ||||
| 			else if(points[4].first == x && points[4].second == y) | ||||
| 				std::cout << "\033[1;25m4"; // tail | ||||
| 			else if(points[5].first == x && points[5].second == y) | ||||
| 				std::cout << "\033[1;25m5"; // tail | ||||
| 			else if(points[6].first == x && points[6].second == y) | ||||
| 				std::cout << "\033[1;25m6"; // tail | ||||
| 			else if(points[7].first == x && points[7].second == y) | ||||
| 				std::cout << "\033[1;25m7"; // tail | ||||
| 			else if(points[8].first == x && points[8].second == y) | ||||
| 				std::cout << "\033[1;25m8"; // tail | ||||
| 			else if(points[9].first == x && points[9].second == y) | ||||
| 				std::cout << "\033[1;25m9"; // tail | ||||
| 			else if(visited_positions.contains({x, y})) | ||||
| 				std::cout << "\033[1;31mX"; // red | ||||
| 			else if(visited_positions_part2.contains({x, y})) | ||||
| 				std::cout << "\033[1;20mY"; // ?? | ||||
| 			else | ||||
| 				std::cout << "\033[0m-"; // default white | ||||
| 		} | ||||
| @@ -59,9 +110,11 @@ int main() | ||||
| 	unsigned long total_pt2 = 0; | ||||
|  | ||||
| 	std::set<std::pair<int, int> > visited_positions; | ||||
| 	std::set<std::pair<int, int> > visited_positions_part2; | ||||
|  | ||||
| 	std::pair<int, int> head = {0,0}; | ||||
| 	std::pair<int, int> tail = {0,0}; | ||||
| 	std::vector<std::pair<int, int> > points; | ||||
| 	for(auto i = 0; i < 10; ++i) | ||||
| 		points.push_back({0,0}); | ||||
|  | ||||
| 	char dir; | ||||
| 	int amt; | ||||
| @@ -80,55 +133,34 @@ int main() | ||||
| 			switch(dir) | ||||
| 			{ | ||||
| 			case 'U': | ||||
| 				head.second--; | ||||
| 				points[0].second--; | ||||
| 				break; | ||||
| 			case 'D': | ||||
| 				head.second++; | ||||
| 				points[0].second++; | ||||
| 				break; | ||||
| 			case 'L': | ||||
| 				head.first--; | ||||
| 				points[0].first--; | ||||
| 				break; | ||||
| 			case 'R': | ||||
| 				head.first++; | ||||
| 				points[0].first++; | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
| 			// Follow with tail: | ||||
| 			const int x_diff = head.first - tail.first; | ||||
| 			const int y_diff = head.second - tail.second; | ||||
| 			if(std::abs(x_diff) > 1) // 2 away | ||||
| 			{ | ||||
| 				tail.first += (head.first - tail.first) / 2; | ||||
| 				if(y_diff) | ||||
| 				{ | ||||
| 					int to_change = std::ceil(std::abs(head.second - tail.second) / 2.0); | ||||
| 					if(y_diff < 0) | ||||
| 						tail.second -= to_change; | ||||
| 					else | ||||
| 						tail.second += to_change; | ||||
| 				} | ||||
| 			} | ||||
| 			if(std::abs(y_diff) > 1) // 2 away | ||||
| 			{ | ||||
| 				tail.second += (head.second - tail.second) / 2; | ||||
| 				if(x_diff) | ||||
| 				{ | ||||
| 					int to_change = std::ceil(std::abs(head.first - tail.first) / 2.0); | ||||
| 					if(x_diff < 0) | ||||
| 						tail.first -= to_change; | ||||
| 					else | ||||
| 						tail.first += to_change; | ||||
| 				} | ||||
| 			} | ||||
| 			for(auto i = 0; i < points.size() - 1; ++i) | ||||
| 				ApplyMovement(points[i], points[i+1]); | ||||
|  | ||||
| 			visited_positions.insert(tail); | ||||
| 			// DebugPrint(head, tail, visited_positions); | ||||
| 			// usleep(1000000); | ||||
| 			visited_positions.insert(points[1]); | ||||
| 			visited_positions_part2.insert(points.back()); | ||||
|  | ||||
| 			DebugPrint(points, visited_positions, visited_positions_part2); | ||||
| 			usleep(100000); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	DebugPrint(head, tail, visited_positions); | ||||
| 	DebugPrint(points, visited_positions, visited_positions_part2); | ||||
| 	total = visited_positions.size(); | ||||
| 	total_pt2 = visited_positions_part2.size(); | ||||
|  | ||||
| 	std::cout << "    Total: " <<     total << std::endl; | ||||
| 	std::cout << "PT2 Total: " << total_pt2 << std::endl; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user