From 2e59d1bdc0282965bbd1879144c60577a0034195 Mon Sep 17 00:00:00 2001 From: Karl Spickermann Date: Fri, 24 Dec 2021 14:09:03 +0100 Subject: [PATCH] Day23 --- src/day23/day23.go | 47 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/day23/day23.go b/src/day23/day23.go index 8865c88..3e0cd36 100644 --- a/src/day23/day23.go +++ b/src/day23/day23.go @@ -9,7 +9,6 @@ import ( type board struct { corridor [11]rune rooms [4][4]rune - energy int } var costs = map[rune]int{ @@ -31,21 +30,18 @@ var enterableCorridorPos = [7]int{0, 1, 3, 5, 7, 9, 10} func main() { playBoard := board{ [11]rune{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}, - [4][4]rune{{'D', 'D', 'D', 'B'}, {'D', 'C', 'B', 'A'}, {'C', 'B', 'A', 'A'}, {'B', 'A', 'C', 'C'}}, 0} - currentBoards := []board{} - endBoards := []board{} - currentBoards = append(currentBoards, playBoard) + [4][4]rune{{'D', 'D', 'D', 'B'}, {'D', 'C', 'B', 'A'}, {'C', 'B', 'A', 'A'}, {'B', 'A', 'C', 'C'}}} + currentBoards := make(map[board]int) + endBoards := make(map[board]int) + currentBoards[playBoard] = 0 for len(currentBoards) > 0 { step(¤tBoards, &endBoards) - fmt.Println(len(currentBoards)) - fmt.Println(len(endBoards)) } - fmt.Println(len(endBoards)) minEnergy := 9999999 - for _, endBoard := range endBoards { - if checkWinner(endBoard) && endBoard.energy < minEnergy { - if minEnergy > endBoard.energy { - minEnergy = endBoard.energy + for endBoard, energy := range endBoards { + if checkWinner(endBoard) && energy < minEnergy { + if minEnergy > energy { + minEnergy = energy } } } @@ -63,25 +59,28 @@ func checkWinner(board board) bool { return true } -func step(currentBoards *[]board, endBoards *[]board) { - var newBoards []board - for _, selectedBoard := range *currentBoards { +func step(currentBoards *map[board]int, endBoards *map[board]int) { + for selectedBoard, selectedEnergy := range *currentBoards { + delete(*currentBoards, selectedBoard) possibleMoves := getPossibleMoves(selectedBoard) if len(possibleMoves) == 0 { - *endBoards = append(*endBoards, selectedBoard) + if (*endBoards)[selectedBoard] == 0 || selectedEnergy < (*endBoards)[selectedBoard] { + (*endBoards)[selectedBoard] = selectedEnergy + } } for start, targets := range possibleMoves { for _, target := range targets { - tmpNewBoard := useMove(selectedBoard, [2][2]int{start, target}) - newBoards = append(newBoards, tmpNewBoard) + tmpNewBoard, tmpNewErnergy := useMove(selectedBoard, [2][2]int{start, target}, selectedEnergy) + if (*currentBoards)[tmpNewBoard] == 0 || tmpNewErnergy < (*currentBoards)[tmpNewBoard] { + (*currentBoards)[tmpNewBoard] = tmpNewErnergy + } } } } - *currentBoards = newBoards return } -func useMove(board board, move [2][2]int) board { +func useMove(board board, move [2][2]int, energy int) (board, int) { //Remove moved Amphoid var amphoidType rune if move[0][0] == 0 { @@ -102,14 +101,14 @@ func useMove(board board, move [2][2]int) board { //Calculate cost traveledDistance := 0 if move[0][0] == 0 { - traveledDistance += Abs(move[0][1] - (move[1][0]*2 + 2)) + traveledDistance += Abs(move[0][1] - ((move[1][0]-1)*2 + 2)) traveledDistance += move[1][1] + 1 } else { - traveledDistance += Abs(move[1][1] - (move[0][0]*2 + 2)) + traveledDistance += Abs(move[1][1] - ((move[0][0]-1)*2 + 2)) traveledDistance += move[0][1] + 1 } - board.energy += costs[amphoidType] * (traveledDistance) - return board + energy += costs[amphoidType] * (traveledDistance) + return board, energy } func getPossibleMoves(board board) map[[2]int][][2]int {