From b0bdd32281ff4f4d6e407e52b2b29df30b4ab13b Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Thu, 31 Dec 2020 12:29:46 +0100 Subject: [PATCH] day21 - cleanup --- day21/day.go | 59 ++++++++++++++++------------------------------------ 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/day21/day.go b/day21/day.go index a16d8db..4f76e98 100644 --- a/day21/day.go +++ b/day21/day.go @@ -107,7 +107,7 @@ func fight(playerHp, playerPower, playerArmor, bossHp, bossPower, bossArmor int) return math.Ceil(float64(bossHp)/playerStrike) <= math.Ceil(float64(playerHp)/bossStrike) } -func Part1(puzzle tools.AoCPuzzle) interface{} { +func getMinMaxGold(puzzle tools.AoCPuzzle) (minGold int, maxGold int) { input := puzzle.GetInputArray() hpLine := strings.Split(input[0], ": ") powerLine := strings.Split(input[1], ": ") @@ -122,10 +122,9 @@ func Part1(puzzle tools.AoCPuzzle) interface{} { goldSpent := 0 - minGold := math.MaxInt32 + minGold = math.MaxInt32 for _, weaponStats := range weapons { for _, armorStats := range armor { - goldSpent = weaponStats["cost"] + armorStats["cost"] for ring1Name, ring1Stats := range rings { for ring2Name, ring2Stats := range rings { if ring1Name == ring2Name { @@ -135,50 +134,28 @@ func Part1(puzzle tools.AoCPuzzle) interface{} { playerPower = weaponStats["damage"] + ring1Stats["damage"] + ring2Stats["damage"] playerArmor = armorStats["armor"] + ring1Stats["armor"] + ring2Stats["armor"] - if fight(playerHp, playerPower, playerArmor, bossHp, bossPower, bossArmor) && goldSpent < minGold { + playerWon := fight(playerHp, playerPower, playerArmor, bossHp, bossPower, bossArmor) + if playerWon && goldSpent < minGold { minGold = goldSpent - } - } - } - } - } - - return minGold -} - -func Part2(puzzle tools.AoCPuzzle) interface{} { - input := puzzle.GetInputArray() - hpLine := strings.Split(input[0], ": ") - powerLine := strings.Split(input[1], ": ") - armorLine := strings.Split(input[2], ": ") - bossHp, _ := strconv.Atoi(hpLine[1]) - bossPower, _ := strconv.Atoi(powerLine[1]) - bossArmor, _ := strconv.Atoi(armorLine[1]) - - playerHp := 100 - playerPower := 0 - playerArmor := 0 - - goldSpent := 0 - - maxGold := 0 - for _, weaponStats := range weapons { - for _, armorStats := range armor { - for ring1Name, ring1Stats := range rings { - for ring2Name, ring2Stats := range rings { - if ring1Name == ring2Name { - continue - } - goldSpent = weaponStats["cost"] + armorStats["cost"] + ring1Stats["cost"] + ring2Stats["cost"] - playerPower = weaponStats["damage"] + ring1Stats["damage"] + ring2Stats["damage"] - playerArmor = armorStats["armor"] + ring1Stats["armor"] + ring2Stats["armor"] - - if !fight(playerHp, playerPower, playerArmor, bossHp, bossPower, bossArmor) && goldSpent > maxGold { + } else if !playerWon && goldSpent > maxGold { maxGold = goldSpent } } } } } + + return minGold, maxGold +} + +func Part1(puzzle tools.AoCPuzzle) interface{} { + minGold, _ := getMinMaxGold(puzzle) + + return minGold +} + +func Part2(puzzle tools.AoCPuzzle) interface{} { + _, maxGold := getMinMaxGold(puzzle) + return maxGold }