-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay5Part1.java
More file actions
74 lines (57 loc) · 2.08 KB
/
Copy pathDay5Part1.java
File metadata and controls
74 lines (57 loc) · 2.08 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
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
public class Day5Part1 {
// Rules set: key=page, values -- set of pages that must be after the key page. Note: page's number is less 100
public static final Map<Integer, Set<Integer>> rules = new HashMap<>(100);
public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("day5-input.txt"));
int answer = 0;
boolean rulesAreRead = false;
while (input.hasNextLine()) {
String line = input.nextLine();
if (line.isEmpty()) {
rulesAreRead = true;
} else {
if (!rulesAreRead) {
handleRule(line);
} else {
answer += handleUpdate(line);
}
}
}
System.out.println(answer);
}
private static void handleRule(String line) {
String[] numbers = line.split("\\|");
int pageKey = Integer.parseInt(numbers[0]);
int pageAfter = Integer.parseInt(numbers[1]);
if (rules.containsKey(pageKey)) {
rules.get(pageKey).add(pageAfter);
} else {
Set<Integer> pagesAfter = new HashSet<>();
pagesAfter.add(pageAfter);
rules.put(pageKey, pagesAfter);
}
}
private static int handleUpdate(String line) {
int[] pages = Arrays.stream(line.split(",")).mapToInt(Integer::parseInt).toArray();
Set<Integer> pagesBefore = new HashSet<>();
for (int page : pages) {
Set<Integer> pagesAfter = rules.computeIfAbsent(page, k -> new HashSet<>());
if (intersects(pagesBefore, pagesAfter)) {
return 0;
}
pagesBefore.add(page);
}
return pages[pages.length / 2];
}
private static boolean intersects(Set<Integer> first, Set<Integer> second) {
for (Integer i : first) {
if (second.contains(i)) {
return true;
}
}
return false;
}
}