2022 Day 9
Part 1
Problem
General solution
Solution: Go
Our first attempt:
for mi := range moveInstructions {
// Move the head
head.x += moveInstructions[mi].DeltaX
head.y += moveInstructions[mi].DeltaY
// If the distance between the head and the tail is more than 1
// across X or Y, move the tail 1 point in the opposite direction
headTailDistanceX := head.x - tail.x
headTailDistanceY := head.y - tail.y
if headTailDistanceX < -1 {
tail.x -= 1
} else if headTailDistanceX > 1 {
tail.x += 1
}
if headTailDistanceY < -1 {
tail.y -= 1
} else if headTailDistanceY > 1 {
tail.y += 1
}
tailVisits[tail] = true
fmt.Printf("%#v\n", head)
fmt.Printf("%#v\n\n", tail)
}
This will cause the tail to move the absolute minimum required to be adjacent, including diagonal adjacency. However, whilst diagonal adjacency is considered to be touching, if the tail is not adjacent after the head has moved then the tail must move to be adjacent in the X or Y axis.