@@ -10,9 +10,9 @@ public function solve_part_1(): string
10
10
$ headX = $ headY = 0 ;
11
11
$ tailX = $ tailY = 0 ;
12
12
$ tailPositions = [];
13
+ $ tailPositions ["{$ tailX }| {$ tailY }" ] = true ;
13
14
foreach ($ moves as $ move ) {
14
15
list ($ x , $ y ) = $ move ;
15
- $ tailPositions ["{$ tailX }| {$ tailY }" ] = true ;
16
16
$ headX += $ x ;
17
17
$ headY += $ y ;
18
18
@@ -37,7 +37,41 @@ public function solve_part_1(): string
37
37
38
38
public function solve_part_2 (): string
39
39
{
40
- return "TODO " ;
40
+ $ X = 0 ;
41
+ $ Y = 1 ;
42
+ $ moves = $ this ->getMoves ();
43
+ $ knotCount = 10 ;
44
+ $ knots = $ this ->fillArray ($ knotCount );
45
+ $ tailPositions = [];
46
+ $ tailPositions ["0|0 " ] = true ;
47
+ foreach ($ moves as $ move ) {
48
+ list ($ x , $ y ) = $ move ;
49
+
50
+ $ knots [0 ][$ X ] += $ x ;
51
+ $ knots [0 ][$ Y ] += $ y ;
52
+ for ($ i = 1 ; $ i < $ knotCount ; $ i += 1 ) {
53
+ if ($ this ->inRange ($ knots [$ i -1 ][$ X ], $ knots [$ i -1 ][$ Y ], $ knots [$ i ][$ X ], $ knots [$ i ][$ Y ])) {
54
+ break ;
55
+ } else {
56
+ $ xdiff = $ knots [$ i -1 ][$ X ] - $ knots [$ i ][$ X ];
57
+ $ ydiff = $ knots [$ i -1 ][$ Y ] - $ knots [$ i ][$ Y ];
58
+ if ($ knots [$ i -1 ][$ X ] != $ knots [$ i ][$ X ] && $ knots [$ i -1 ][$ Y ] != $ knots [$ i ][$ Y ]) {
59
+ // diagonal
60
+ $ knots [$ i ][$ X ] += $ this ->sign ($ xdiff );
61
+ $ knots [$ i ][$ Y ] += $ this ->sign ($ ydiff );
62
+ } elseif (abs ($ xdiff ) > abs ($ ydiff )) {
63
+ $ knots [$ i ][$ X ] += $ this ->sign ($ xdiff );
64
+ } elseif (abs ($ ydiff ) > abs ($ xdiff )) {
65
+ $ knots [$ i ][$ Y ] += $ this ->sign ($ ydiff );
66
+ }
67
+ if ($ i === $ knotCount -1 ) {
68
+ $ tailPositions ["{$ knots [$ i ][$ X ]}| {$ knots [$ i ][$ Y ]}" ] = true ;
69
+ }
70
+ }
71
+ }
72
+
73
+ }
74
+ return count ($ tailPositions );
41
75
}
42
76
43
77
protected function sign ($ n )
@@ -51,6 +85,15 @@ protected function sign($n)
51
85
return 0 ;
52
86
}
53
87
88
+ protected function fillArray ($ n )
89
+ {
90
+ $ result = [];
91
+ for ($ i = 0 ; $ i < $ n ; $ i += 1 ) {
92
+ $ result [] = [0 , 0 ];
93
+ }
94
+ return $ result ;
95
+ }
96
+
54
97
protected function inRange ($ x1 , $ y1 , $ x2 , $ y2 )
55
98
{
56
99
return abs ($ x1 - $ x2 ) < 2 && abs ($ y1 - $ y2 ) < 2 ;
0 commit comments