package main import ( "fmt" "math" "strconv" "strings" "github.com/alexchao26/advent-of-code-go/util" ) func main() { // read input file, split by the new line, then split each line by commas input := util.ReadFile("../input.txt") sli := strings.Split(input, "\n") split1 := strings.Split(sli[0], ",") split2 := strings.Split(sli[1], ",") coordsMap1 := makeCoordinatesMap(split1) coordsMap2 := makeCoordinatesMap(split2) lowestSumOfDistances := math.MaxInt32 // iterate over all keys & values in coordsMap1 for key, value1 := range coordsMap1 { // check if the same key is in coordsMap2 if value2, ok := coordsMap2[key]; ok { // update lowestSumOfDistances if applicable if lowestSumOfDistances > value1+value2 { lowestSumOfDistances = value1 + value2 } } } fmt.Println("Lowest sum of distances", lowestSumOfDistances) } // return a map that has keys of strings and a value of an int of steps to reach the coordinate func makeCoordinatesMap(directionsSlice []string) map[string]int { gridOfCoordinates := map[string]int{} prevX := 0 prevY := 0 runningLength := 0 for i := 0; i < len(directionsSlice); i++ { // grab the current element v := directionsSlice[i] // split this element into a slice of runes... runeSlice := []rune(v) // stores number parsed off of this element num, _ := strconv.Atoi(string(runeSlice[1:])) // fmt.Println(num) // loop from 0 to num and add to the map/gridOfCoordinates for num > 0 { // on each loop increment the runningLength, decrement num runningLength++ num-- switch runeSlice[0] { case 'R': // if going right, increment prevX prevX++ case 'L': prevX-- case 'U': prevY++ case 'D': prevY-- } // set `${prevX}x${prevY}` to the map with runningLength as the value newCoord := strconv.Itoa(prevX) + "x" + strconv.Itoa(prevY) _, ok := gridOfCoordinates[newCoord] if ok == false { gridOfCoordinates[newCoord] = runningLength } } } // fmt.Println(gridOfCoordinates) return gridOfCoordinates }