Skip to content

Commit f806c83

Browse files
committed
Day 16 2022 part 2 first draft
1 parent 117d5be commit f806c83

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

src/main/java/com/sbaars/adventofcode/common/Day.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,17 @@ private String getDayPath() {
4848
public abstract Object part2();
4949

5050
public void printParts() {
51-
solutionPart1 = part1();
52-
if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional<?>)solutionPart1).get();
53-
System.out.println("Part 1: " + solutionPart1);
51+
// solutionPart1 = part1();
52+
// if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional<?>)solutionPart1).get();
53+
// System.out.println("Part 1: " + solutionPart1);
5454
solutionPart2 = part2();
5555
if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional<?>)solutionPart2).get();
5656
System.out.println("Part 2: " + solutionPart2);
5757
}
5858

5959
public void printParts(int example) {
6060
this.example = example;
61-
System.out.println("Part 1: " + part1());
61+
// System.out.println("Part 1: " + part1());
6262
System.out.println("Part 2: " + part2());
6363
}
6464

src/main/java/com/sbaars/adventofcode/util/AOCUtils.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public static<A> Stream<Pair<A, A>> pairs(List<A> l) {
2727
}
2828

2929
public static<A> Stream<Pair<A, A>> allPairs(List<A> l) {
30-
return range(0, l.size()).boxed().flatMap(i -> range(i+1, l.size()).mapToObj(j -> new Pair<A, A>(l.get(i), l.get(j))));
30+
return range(0, l.size()).boxed().flatMap(i -> range(i+1, l.size()).mapToObj(j -> new Pair<>(l.get(i), l.get(j))));
31+
}
32+
33+
public static<A, B> Stream<Pair<A, B>> allPairs(List<A> l1, List<B> l2) {
34+
return range(0, l1.size()).boxed().flatMap(i -> l2.stream().map(b -> new Pair<>(l1.get(i), b)));
3135
}
3236
}

src/main/java/com/sbaars/adventofcode/year22/days/Day16.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.stream.IntStream;
99

1010
import static com.sbaars.adventofcode.common.ReadsFormattedString.readString;
11+
import static com.sbaars.adventofcode.util.AOCUtils.allPairs;
1112

1213
public class Day16 extends Day2022 {
1314

@@ -27,6 +28,7 @@ public static void main(String[] args) {
2728

2829
public record Valve(String name, long flow, String others) {}
2930
public record State(Map<String, Long> open, int index, long totalFlow) {}
31+
public record State2(Map<String, Long> open, int myIndex, int elephantIndex, long totalFlow) {}
3032

3133
@Override
3234
public Object part1() {
@@ -59,6 +61,51 @@ public Object part1() {
5961

6062
@Override
6163
public Object part2() {
62-
return "";
64+
List<Valve> in = dayStream().map(s -> {
65+
try {
66+
return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class);
67+
} catch (IllegalStateException e) {
68+
return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class);
69+
}
70+
}).toList();
71+
Set<String> openable = in.stream().filter(s -> s.flow > 0).map(Valve::name).collect(Collectors.toSet());
72+
Map<String, Integer> indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i));
73+
Set<State2> states = new HashSet<>();
74+
states.add(new State2(new HashMap<>(), 0, 0, 0));
75+
for(int minutes = 0; minutes<30; minutes++) {
76+
Set<State2> newStates = new HashSet<>();
77+
for(State2 s : states) {
78+
79+
Valve myValve = in.get(s.myIndex);
80+
Valve eleValve = in.get(s.elephantIndex);
81+
long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow;
82+
if(s.open.keySet().equals(openable)) { // All valves are open, time to chill
83+
newStates.add(new State2(s.open, s.myIndex, s.elephantIndex, flow));
84+
}
85+
boolean couldOpen = false;
86+
if(myValve.flow > 0 && !s.open.containsKey(myValve.name)) {
87+
Map<String, Long> newOpen = new HashMap<>(s.open);
88+
newOpen.put(myValve.name, myValve.flow);
89+
Arrays.stream(eleValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, s.myIndex, indices.get(name), flow)));
90+
couldOpen = true;
91+
}
92+
if(eleValve.flow > 0 && !s.open.containsKey(eleValve.name)) {
93+
Map<String, Long> newOpen = new HashMap<>(s.open);
94+
newOpen.put(eleValve.name, eleValve.flow);
95+
Arrays.stream(myValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, indices.get(name), s.elephantIndex, flow)));
96+
couldOpen = true;
97+
}
98+
if(myValve.flow > 0 && !s.open.containsKey(myValve.name) && eleValve.flow > 0 && !s.open.containsKey(eleValve.name)) {
99+
Map<String, Long> newOpen = new HashMap<>(s.open);
100+
newOpen.put(myValve.name, myValve.flow);
101+
newOpen.put(eleValve.name, eleValve.flow);
102+
newStates.add(new State2(newOpen, s.myIndex, s.elephantIndex, flow));
103+
couldOpen = true;
104+
}
105+
if(!couldOpen) allPairs(List.of(myValve.others.split(", ")), List.of(eleValve.others.split(", "))).forEach(p -> newStates.add(new State2(s.open, indices.get(p.a()), indices.get(p.b()), flow)));
106+
}
107+
states = newStates;
108+
}
109+
return states.stream().mapToLong(State2::totalFlow).max().getAsLong();
63110
}
64111
}

0 commit comments

Comments
 (0)