-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay09.java
More file actions
107 lines (101 loc) · 3.34 KB
/
Day09.java
File metadata and controls
107 lines (101 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.util.HashSet;
import java.util.List;
import java.lang.Math;
public class Day09 {
public static void Run(List<String> input) {
p1(input);
p2(input);
}
private static void p1(List<String> input) {
var head = new Position();
var tail = new Position();
var tailPositions = new HashSet<Position>();
for (var line : input) {
int deltaX = 0;
int deltaY = 0;
char direction = line.charAt(0);
switch (direction) {
case 'U':
deltaY = 1;
break;
case 'D':
deltaY = -1;
break;
case 'R':
deltaX = 1;
break;
case 'L':
deltaX = -1;
break;
}
int steps = Integer.parseInt(line.substring(2));
for (int i = 0; i < steps; i++) {
head.X += deltaX;
head.Y += deltaY;
UpdateFollower(head, tail);
tailPositions.add(tail);
}
}
System.out.println("09.1 - positions visited by tail:" + tailPositions.size());
}
private static void p2(List<String> input) {
var knots =new Position[10];
for(int i=0; i<knots.length; i++)
knots[i]=new Position();
var tailPositions = new HashSet<Position>();
for (var line : input) {
int deltaX = 0;
int deltaY = 0;
char direction = line.charAt(0);
switch (direction) {
case 'U':
deltaY = 1;
break;
case 'D':
deltaY = -1;
break;
case 'R':
deltaX = 1;
break;
case 'L':
deltaX = -1;
break;
}
int steps = Integer.parseInt(line.substring(2));
for (int step = 0; step < steps; step++) {
knots[0].X += deltaX;
knots[0].Y += deltaY;
for (int knot=1; knot<knots.length; knot++){
UpdateFollower(knots[knot-1], knots[knot]);
}
tailPositions.add(knots[9]);
}
}
System.out.println("09.2 - positions visited by tail:" + tailPositions.size());
}
private static void UpdateFollower(Position leader, Position follower) {
int deltaX = leader.X - follower.X;
int deltaY = leader.Y - follower.Y;
if ((Math.abs(deltaX) < 2) && (Math.abs(deltaY) < 2)){
//close enough, no move necessary
return;
}
// different rows, move vertically one step in direction of head
follower.X += Math.signum(deltaX);
// different columns, move horizontally one step in direction of head
follower.Y += Math.signum(deltaY);
}
private static class Position {
public int X = 0;
public int Y = 0;
@Override
public boolean equals(Object obj) {
var otherposition = (Position)obj;
return (otherposition.X==X) && (otherposition.Y==Y);
}
@Override
public int hashCode() {
return (X<<16) ^ Y;
}
}
}