package main import ( "fmt" helpers "git.bullercodeworks.com/brian/adventofcode/helpers" "math" "strings" ) const MaxInt = int(^uint(0) >> 1) func main() { inp := helpers.StdinToStringSlice() part1(inp) } func part1(inp []string) { var allWires []*Wire for _, v := range inp { wire := NewWire() wrk := strings.Split(v, ",") for _, p := range wrk { wire.Go(p) } allWires = append(allWires, wire) } var shortestCoord, fewestStepsCoord Coord shortest := MaxInt shortestSteps := MaxInt for p1i, p1 := range allWires[0].path { if p1.x == 0 && p1.y == 0 { continue } for p2i, p2 := range allWires[1].path { if p2.x == 0 && p2.y == 0 { continue } if p1.equals(p2) { wrk := manhattanDistance(p1.x, p1.y, 0, 0) if wrk < shortest { shortest = wrk shortestCoord = p1 } if p1i+p2i < shortestSteps { shortestSteps = p1i + p2i fewestStepsCoord = p1 } } } } fmt.Println("Closest:", shortest, shortestCoord) fmt.Println("Fewest Steps:", shortestSteps, fewestStepsCoord) } type Wire struct { curr Coord path []Coord } func NewWire() *Wire { w := Wire{} w.curr = Coord{0, 0} w.path = append(w.path, w.curr) return &w } func (w *Wire) Go(cmd string) { dir := cmd[0] length := helpers.Atoi(cmd[1:]) for length > 0 { w.Move(dir) w.path = append(w.path, w.curr) length-- } } func (w *Wire) Move(dir byte) { switch dir { case 'U': w.curr = Coord{w.curr.x, w.curr.y - 1} case 'R': w.curr = Coord{w.curr.x + 1, w.curr.y} case 'D': w.curr = Coord{w.curr.x, w.curr.y + 1} case 'L': w.curr = Coord{w.curr.x - 1, w.curr.y} } } type Coord struct { x, y int } func (c Coord) equals(b Coord) bool { return c.x == b.x && c.y == b.y } func (c Coord) string() string { return fmt.Sprintf("{%2d,%2d}", c.x, c.y) } func manhattanDistance(x1, y1, x2, y2 int) int { return int(math.Abs(float64(x1)-float64(x2)) + math.Abs(float64(y1)-float64(y2))) }