6 "adventofcode2022/utils"
7 sparsegrid "adventofcode2022/utils/sparseGrid"
16 func Part1(input string) int {
18 grid := sparsegrid.NewGrid(false)
19 grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
20 for _, line := range strings.Split(input, "\n") {
33 n := utils.MustAtoi(line[2:])
34 for i := 0; i < n; i++ {
41 grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
47 func Part2(input string) int {
49 grid := sparsegrid.NewGrid(false)
50 grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
51 for _, line := range strings.Split(input, "\n") {
64 n := utils.MustAtoi(line[2:])
65 for i := 0; i < n; i++ {
72 grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
78 func newRope(size int) *rope {
81 posX: make([]int, size),
82 posY: make([]int, size),
86 func (r *rope) updateTail() {
88 for i := 1; i < r.size; i++ {
89 diffX := utils.Abs(r.posX[i-1] - r.posX[i])
90 diffY := utils.Abs(r.posY[i-1] - r.posY[i])
91 if diffX <= 1 && diffY <= 1 {
92 // no need to update node if it's touching
95 moves := [][]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
96 for _, move := range moves {
98 utils.Abs(r.posX[i-1]-r.posX[i]+move[0]),
99 utils.Abs(r.posY[i-1]-r.posY[i]+move[1]))
101 r.posX[i] = r.posX[i-1] + move[0]
102 r.posY[i] = r.posY[i-1] + move[1]
106 moves = [][]int{{1, 1}, {-1, 1}, {1, -1}, {-1, -1}}
107 for _, move := range moves {
109 utils.Abs(r.posX[i-1]-r.posX[i]+move[0]),
110 utils.Abs(r.posY[i-1]-r.posY[i]+move[1]))
112 r.posX[i] = r.posX[i-1] + move[0]
113 r.posY[i] = r.posY[i-1] + move[1]