|  | @@ -48,7 +48,7 @@ func readFile(file *os.File) [2][]int {
 | 
											
												
													
														|  |  	return decks
 |  |  	return decks
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func play1(decks [2][]int) []int {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func play1(decks [2][]int) (int, []int) {
 | 
											
												
													
														|  |  	for {
 |  |  	for {
 | 
											
												
													
														|  |  		if len(decks[0]) == 0 || len(decks[1]) == 0 {
 |  |  		if len(decks[0]) == 0 || len(decks[1]) == 0 {
 | 
											
												
													
														|  |  			break
 |  |  			break
 | 
											
										
											
												
													
														|  | @@ -70,9 +70,81 @@ func play1(decks [2][]int) []int {
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	if len(decks[0]) == 0 {
 |  |  	if len(decks[0]) == 0 {
 | 
											
												
													
														|  | -		return decks[1]
 |  | 
 | 
											
												
													
														|  | 
 |  | +		return 1, decks[1]
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return 0, decks[0]
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func checkDeck(deck []int, deckFromRound []int) bool {
 | 
											
												
													
														|  | 
 |  | +	for i, card := range deck {
 | 
											
												
													
														|  | 
 |  | +		if card != deckFromRound[i] {
 | 
											
												
													
														|  | 
 |  | +			return false
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return true
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func checkDecks(deck1, deck2 []int, previousRounds []previous) bool {
 | 
											
												
													
														|  | 
 |  | +	for _, round := range previousRounds {
 | 
											
												
													
														|  | 
 |  | +		if checkDeck(deck1, round.deck1) || checkDeck(deck2, round.deck2) {
 | 
											
												
													
														|  | 
 |  | +			return true
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	return false
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +type previous struct {
 | 
											
												
													
														|  | 
 |  | +	deck1 []int
 | 
											
												
													
														|  | 
 |  | +	deck2 []int
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +func play2(decks [2][]int) []int {
 | 
											
												
													
														|  | 
 |  | +	var previousRounds []previous
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	for {
 | 
											
												
													
														|  | 
 |  | +		if len(previousRounds) > 0 {
 | 
											
												
													
														|  | 
 |  | +			if checkDecks(decks[0], decks[1], previousRounds) {
 | 
											
												
													
														|  | 
 |  | +				return decks[0]
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		previousRounds = append(previousRounds, previous{deck1: decks[0], deck2: decks[1]})
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		player1Hand := decks[0][0]
 | 
											
												
													
														|  | 
 |  | +		decks[0] = decks[0][1:len(decks[0])]
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		player2Hand := decks[1][0]
 | 
											
												
													
														|  | 
 |  | +		decks[1] = decks[1][1:len(decks[1])]
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		if len(decks[0]) >= player1Hand && len(decks[1]) >= player2Hand {
 | 
											
												
													
														|  | 
 |  | +			var newDecks [2][]int
 | 
											
												
													
														|  | 
 |  | +			for i, card := range decks[0] {
 | 
											
												
													
														|  | 
 |  | +				if i >= player1Hand {
 | 
											
												
													
														|  | 
 |  | +					break
 | 
											
												
													
														|  | 
 |  | +				}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +				newDecks[0] = append(newDecks[0], card)
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +			for i, card := range decks[1] {
 | 
											
												
													
														|  | 
 |  | +				if i >= player1Hand {
 | 
											
												
													
														|  | 
 |  | +					break
 | 
											
												
													
														|  | 
 |  | +				}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +				newDecks[1] = append(newDecks[1], card)
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		} else {
 | 
											
												
													
														|  | 
 |  | +			if player1Hand > player2Hand {
 | 
											
												
													
														|  | 
 |  | +				decks[0] = append(decks[0], player1Hand)
 | 
											
												
													
														|  | 
 |  | +				decks[0] = append(decks[0], player2Hand)
 | 
											
												
													
														|  | 
 |  | +			} else {
 | 
											
												
													
														|  | 
 |  | +				decks[1] = append(decks[1], player2Hand)
 | 
											
												
													
														|  | 
 |  | +				decks[1] = append(decks[1], player1Hand)
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	return decks[0]
 |  | 
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func calculate(deck []int) int {
 |  |  func calculate(deck []int) int {
 | 
											
										
											
												
													
														|  | @@ -105,6 +177,6 @@ func main() {
 | 
											
												
													
														|  |  		log.Fatalf("Failed to close file: %s", err)
 |  |  		log.Fatalf("Failed to close file: %s", err)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	winningDeck := play1(decks)
 |  | 
 | 
											
												
													
														|  | 
 |  | +	_, winningDeck := play1(decks)
 | 
											
												
													
														|  |  	fmt.Println("Part1:", calculate(winningDeck))
 |  |  	fmt.Println("Part1:", calculate(winningDeck))
 | 
											
												
													
														|  |  }
 |  |  }
 |