-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathDay13.java
69 lines (58 loc) · 1.75 KB
/
Day13.java
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
package com.sbaars.adventofcode.year17.days;
import com.sbaars.adventofcode.year17.Day2017;
import java.util.HashMap;
import java.util.Map;
public class Day13 extends Day2017 {
public Day13() {
super(13);
}
public static void main(String[] args) {
new Day13().printParts();
}
private Map<Integer, Integer> parseScanners() {
Map<Integer, Integer> scanners = new HashMap<>();
for (String line : dayStrings()) {
String[] parts = line.split(": ");
scanners.put(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
}
return scanners;
}
private boolean isCaught(Map<Integer, Integer> scanners, int delay) {
for (Map.Entry<Integer, Integer> entry : scanners.entrySet()) {
int depth = entry.getKey();
int range = entry.getValue();
// Scanner position at time = depth + delay
if ((depth + delay) % (2 * (range - 1)) == 0) {
return true;
}
}
return false;
}
@Override
public Object part1() {
Map<Integer, Integer> scanners = parseScanners();
int severity = 0;
int maxDepth = scanners.keySet().stream().mapToInt(Integer::intValue).max().orElse(0);
// For each layer
for (int depth = 0; depth <= maxDepth; depth++) {
if (scanners.containsKey(depth)) {
int range = scanners.get(depth);
// Scanner position at time = depth is depth % (2 * (range - 1))
// If position is 0, we get caught
if (depth % (2 * (range - 1)) == 0) {
severity += depth * range;
}
}
}
return severity;
}
@Override
public Object part2() {
Map<Integer, Integer> scanners = parseScanners();
int delay = 0;
while (isCaught(scanners, delay)) {
delay++;
}
return delay;
}
}