Completed day2
This commit is contained in:
		
							
								
								
									
										2500
									
								
								input/day02
									
									
									
									
									
								
							
							
						
						
									
										2500
									
								
								input/day02
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,11 +1,108 @@ | |||||||
| #include "../aoc2022.h" | #include "../aoc2022.h" | ||||||
|  |  | ||||||
|  | #define WIN 6 | ||||||
|  | #define DRAW 3 | ||||||
|  | #define LOSS 0 | ||||||
|  |  | ||||||
|  | enum EGameMoves { | ||||||
|  | 	eRock = 1, | ||||||
|  | 	ePaper = 2, | ||||||
|  | 	eScissors = 3 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct SGameMove { | ||||||
|  | 	EGameMoves move, losesTo, winsTo; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum ERules { | ||||||
|  | 	eTheirRules, | ||||||
|  | 	eMyRules | ||||||
|  | }; | ||||||
|  |  | ||||||
| template <typename Output> | template <typename Output> | ||||||
| struct SDay02 : public SDay<Output> { | struct SDay02 : public SDay<Output> { | ||||||
| 	//Class constructor | 	//Class constructor | ||||||
| 	using SDay<Output>::SDay; | 	using SDay<Output>::SDay; | ||||||
|  |  | ||||||
|  | 	//Map to store the collection of alises and plays | ||||||
|  | 	std::map<char, SGameMove*> pairs; | ||||||
|  | 	std::map<EGameMoves, EGameMoves> losingMoves; | ||||||
|  |  | ||||||
|  | 	SGameMove rock{ eRock, ePaper, eScissors }; | ||||||
|  | 	SGameMove paper{ ePaper, eScissors, eRock }; | ||||||
|  | 	SGameMove scissors{ eScissors, eRock, ePaper }; | ||||||
|  |  | ||||||
| 	//Solutions to both days | 	//Solutions to both days | ||||||
| 	Output part1() override final { return Output(); } | 	Output part1() override final { | ||||||
| 	Output part2() override final { return Output(); } | 		//'A' 'X' = rock and loses to paper | ||||||
|  | 		pairs['A'] = &rock; | ||||||
|  | 		pairs['X'] = &rock; // Means Lose | ||||||
|  | 		//'B' 'Y' = paper and loses to scissors | ||||||
|  | 		pairs['B'] = &paper; | ||||||
|  | 		pairs['Y'] = &paper; //Draw | ||||||
|  | 		//'C' 'Z' = scissors and loses to rock | ||||||
|  | 		pairs['C'] = &scissors; | ||||||
|  | 		pairs['Z'] = &scissors; //Win | ||||||
|  |  | ||||||
|  | 		return playGame(eTheirRules); | ||||||
|  | 	} | ||||||
|  | 	Output part2() override final {  | ||||||
|  | 		return playGame(eMyRules); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int theirRules(const SGameMove *player1, const SGameMove *player2) { | ||||||
|  |  | ||||||
|  | 		if (player1->losesTo == player2->move) | ||||||
|  | 		{//We Win | ||||||
|  | 			return (WIN + player2->move); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (player1->move == player2->move) | ||||||
|  | 		{//We Draw | ||||||
|  | 			return (DRAW + player2->move); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		//We Lose | ||||||
|  | 		return (LOSS + player2->move); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int myRules(const SGameMove *player1, const SGameMove *player2) { | ||||||
|  | 		if (player2->move == EGameMoves::eRock) | ||||||
|  | 		{//We must Lose | ||||||
|  | 			return (LOSS + player1->winsTo); | ||||||
|  | 		} | ||||||
|  | 		if (player2->move == EGameMoves::ePaper) | ||||||
|  | 		{//We must Draw | ||||||
|  | 			return (DRAW + player1->move); | ||||||
|  | 		} | ||||||
|  | 		//We must Win | ||||||
|  | 		return (WIN + player1->losesTo); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int playGame(ERules rules) { | ||||||
|  | 		this->input.clear(); | ||||||
|  | 		this->input.seekg(0, std::ios::beg); | ||||||
|  | 		std::string line{ "" }; | ||||||
|  | 		int score{ 0 }; | ||||||
|  |  | ||||||
|  | 		SGameMove *player1, *player2; | ||||||
|  |  | ||||||
|  | 		while (std::getline(this->input, line)) | ||||||
|  | 		{ | ||||||
|  | 			player1 = pairs[line[0]]; | ||||||
|  | 			player2 = pairs[line[2]]; | ||||||
|  |  | ||||||
|  | 			if (rules == eTheirRules) | ||||||
|  | 			{//part1 | ||||||
|  | 				score += theirRules(player1, player2); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{//part2 | ||||||
|  | 				score += myRules(player1, player2); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return score; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user