AdventOfCode2021/day21/21b/main.go
Luke Else 801d7f9a78 day 21b incomplete
tried doing it, very close, I believe I have missed a very simple step or some edge case is not being run.

Value is currently way below what is expected So I either think one of the data structures is behaving badly, or I have missed a key point
2021-12-22 01:02:12 +00:00

146 lines
2.9 KiB
Go

package main
import (
"AdventOfCode2021/shared"
"bufio"
"fmt"
"os"
"regexp"
"strconv"
)
func main() {
//content := returnContent("../input")
content := returnContent("../testInput")
//Construct Game board... in reverse :) (Just makes it easier for stringing them together)
positions := make(map[int]*shared.GamePosition)
gameBoard := shared.GameBoard{
Start: &shared.GamePosition{
Position: 1,
Next: nil,
},
}
positions[1] = gameBoard.Start
next := gameBoard.Start
var currentPosition *shared.GamePosition
for i := 10; i > 1; i-- {
currentPosition = new(shared.GamePosition)
currentPosition.Position = i
currentPosition.Next = next
next = currentPosition
positions[i] = currentPosition
}
gameBoard.Start.Next = currentPosition
//Add Players to the game
players := make(map[int]*shared.Player)
numPlayers := 0
for _, value := range *content {
newPlayer := shared.Player{
PlayerNum: value[0],
Score: 0,
Position: positions[value[1]],
}
players[newPlayer.PlayerNum] = &newPlayer
numPlayers++
}
//Play the GAMEEEEEE
queue := shared.UniverseQueue{}
wins := make((map[int]int))
//Make the initial universe and add to queue
queue.Add(&shared.Universe{Players: players})
//Continue to process the universe
for {
current := queue.Pop()
if current == nil {
break
}
for _, p := range current.Players {
RecurseUniverse(current.Players, &queue, p.PlayerNum, wins)
}
}
fmt.Println(wins[1], wins[2])
}
func RecurseUniverse(players map[int]*shared.Player, queue *shared.UniverseQueue, player int, wins map[int]int) {
for d := 1; d <= 3; d++ {
//Create a new instance based on the current dice roll
alteredPlayer := Roll(*players[player], d)
if alteredPlayer.Score < 21 {
newUniverse := new(shared.Universe)
newPlayers := make(map[int]*shared.Player)
for _, p := range players {
newPlayer := *p
newPlayers[newPlayer.PlayerNum] = &newPlayer
}
newPlayers[player] = alteredPlayer
newUniverse.Players = newPlayers
queue.Add(newUniverse)
} else {
wins[player]++
}
}
}
func Roll(p shared.Player, diceVal int) *shared.Player {
//calculate where the position will be after n positions being moved
position := p.Position
for i := 0; i < diceVal; i++ {
position = position.Next
}
p.Position = position
p.Score += p.Position.Position
return &p
}
func returnContent(path string) *[][]int {
//read file and return it as an array of integers
file, err := os.Open(path)
var content [][]int
if err != nil {
fmt.Println("Unlucky, the file didn't open")
return &content
}
defer file.Close()
scanner := bufio.NewScanner(file)
regex, _ := regexp.Compile(`[0-9]+`)
for scanner.Scan() {
line := regex.FindAllString(scanner.Text(), 2)
nums := []int{}
for i := 0; i < len(line); i++ {
num, _ := strconv.Atoi(line[i])
nums = append(nums, num)
}
content = append(content, nums)
}
return &content
}