package main import ( "fmt" h "git.bullercodeworks.com/brian/adventofcode/helpers" ) var costs map[byte]int var homes map[byte][]h.Coordinate var burrow h.CoordByteMap func main() { costs = map[byte]int{'A': 1, 'B': 10, 'C': 100, 'D': 1000} homes = map[byte][]h.Coordinate{ 'A': []h.Coordinate{h.Coordinate{X: 3, Y: 3}, h.Coordinate{X: 3, Y: 2}}, 'B': []h.Coordinate{h.Coordinate{X: 5, Y: 3}, h.Coordinate{X: 5, Y: 2}}, 'C': []h.Coordinate{h.Coordinate{X: 7, Y: 3}, h.Coordinate{X: 7, Y: 2}}, 'D': []h.Coordinate{h.Coordinate{X: 9, Y: 3}, h.Coordinate{X: 9, Y: 2}}, } inp := h.StdinToStringSlice() burrow = h.StringSliceToCoordByteMap(inp) fmt.Println(burrow) pods := findAllPods() for k, v := range pods { fmt.Println(k, string(v)) } } func findAllPods() map[h.Coordinate]byte { return burrow.FindAllNot(' ', '#', '.') } func getHome(b byte) h.Coordinate { // Returns the home spot for this pod... if burrow.Get(homes[b][0]) == b { return homes[b][1] } return homes[b][0] } func isPod(b byte) bool { return b == 'A' || b == 'B' || b == 'C' || b == 'd' } // pathClear checks: // 1: is the given coordinate a pod? // 2: is the path to the pod's home clear? func pathClear(c h.Coordinate) bool { v := burrow.Get(c) if !isPod(v) { return false } return canMoveFromTo(c, getHome(v)) } func canMoveFromTo(from, to h.Coordinate) bool { if from.Equals(to) { // Not actually moving... return true } if burrow.Get(to) != '.' { return false } if from.X == to.X { // Just moving up or down if from.Y > to.Y { return canMoveFromTo(h.Coordinate{X: from.X, Y: from.Y - 1}, to) } return canMoveFromTo(h.Coordinate{X: from.X, Y: from.Y + 1}, to) } else if from.Y == to.Y { // Just moving left or right if from.X > to.X { return canMoveFromTo(h.Coordinate{X: from.X - 1, Y: from.Y}, to) } return canMoveFromTo(h.Coordinate{X: from.X + 1, Y: from.Y}, to) } }