-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathDay24.java
95 lines (77 loc) · 2.83 KB
/
Day24.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
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
package com.sbaars.adventofcode.year17.days;
import com.sbaars.adventofcode.year17.Day2017;
import java.util.*;
import java.util.stream.Collectors;
public class Day24 extends Day2017 {
private record Component(int port1, int port2) {
boolean hasPort(int port) {
return port1 == port || port2 == port;
}
int getOtherPort(int port) {
return port == port1 ? port2 : port1;
}
int strength() {
return port1 + port2;
}
}
private record Bridge(List<Component> components, int lastPort) {
int strength() {
return components.stream().mapToInt(Component::strength).sum();
}
int length() {
return components.size();
}
}
public Day24() {
super(24);
}
public static void main(String[] args) {
new Day24().printParts();
}
private List<Component> parseComponents() {
return Arrays.stream(dayStrings())
.map(line -> {
String[] parts = line.split("/");
return new Component(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]));
})
.collect(Collectors.toList());
}
private List<Bridge> buildBridges(Bridge currentBridge, List<Component> availableComponents) {
List<Bridge> bridges = new ArrayList<>();
bridges.add(currentBridge);
for (Component component : availableComponents) {
if (component.hasPort(currentBridge.lastPort())) {
List<Component> remainingComponents = new ArrayList<>(availableComponents);
remainingComponents.remove(component);
List<Component> newBridgeComponents = new ArrayList<>(currentBridge.components());
newBridgeComponents.add(component);
Bridge newBridge = new Bridge(newBridgeComponents, component.getOtherPort(currentBridge.lastPort()));
bridges.addAll(buildBridges(newBridge, remainingComponents));
}
}
return bridges;
}
@Override
public Object part1() {
List<Component> components = parseComponents();
List<Bridge> bridges = buildBridges(new Bridge(new ArrayList<>(), 0), components);
return bridges.stream()
.mapToInt(Bridge::strength)
.max()
.orElse(0);
}
@Override
public Object part2() {
List<Component> components = parseComponents();
List<Bridge> bridges = buildBridges(new Bridge(new ArrayList<>(), 0), components);
int maxLength = bridges.stream()
.mapToInt(Bridge::length)
.max()
.orElse(0);
return bridges.stream()
.filter(b -> b.length() == maxLength)
.mapToInt(Bridge::strength)
.max()
.orElse(0);
}
}