Skip to content

Commit c428376

Browse files
committed
2018 day 7 part 2
1 parent 69caf8f commit c428376

File tree

9 files changed

+129
-14
lines changed

9 files changed

+129
-14
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,10 @@ public int compareTo(Node<V> t) {
6464
}
6565
return 0;
6666
}
67+
68+
@Override
69+
public String toString() {
70+
return data.toString();
71+
}
6772
}
6873
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.sbaars.adventofcode.common;
2+
3+
import java.util.Objects;
4+
import java.util.function.BiFunction;
5+
6+
public class MutablePair<A, B> implements Comparable<MutablePair<A, B>> {
7+
private A a;
8+
private B b;
9+
10+
public MutablePair(A a, B b) {
11+
this.a = a;
12+
this.b = b;
13+
}
14+
15+
public static <A, B> MutablePair<A, B> pair(A a, B b) {
16+
return new MutablePair<>(a, b);
17+
}
18+
19+
public A getLeft() {
20+
return a;
21+
}
22+
23+
public B getRight() {
24+
return b;
25+
}
26+
27+
public <C, D> MutablePair<C, D> map(BiFunction<A, B, MutablePair<C, D>> func) {
28+
return func.apply(a(), b());
29+
}
30+
31+
@Override
32+
public int compareTo(MutablePair<A, B> t) {
33+
if (a instanceof Comparable && t.a instanceof Comparable) {
34+
return ((Comparable) a).compareTo(t.a);
35+
}
36+
return 0;
37+
}
38+
39+
public A a() {
40+
return a;
41+
}
42+
43+
public B b() {
44+
return b;
45+
}
46+
47+
public void setA(A a) {
48+
this.a = a;
49+
}
50+
51+
public void setB(B b) {
52+
this.b = b;
53+
}
54+
55+
@Override
56+
public boolean equals(Object obj) {
57+
if (obj == this) return true;
58+
if (obj == null || obj.getClass() != this.getClass()) return false;
59+
var that = (MutablePair) obj;
60+
return Objects.equals(this.a, that.a) &&
61+
Objects.equals(this.b, that.b);
62+
}
63+
64+
@Override
65+
public int hashCode() {
66+
return Objects.hash(a, b);
67+
}
68+
69+
@Override
70+
public String toString() {
71+
return "MutablePair[" +
72+
"a=" + a + ", " +
73+
"b=" + b + ']';
74+
}
75+
76+
}

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

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import java.util.function.BiFunction;
44

5-
public record Pair<A, B>(A a, B b) {
5+
public record Pair<A, B>(A a, B b) implements Comparable<Pair<A, B>> {
66

7-
public static <A, B> Pair<A, B> of(A a, B b) {
8-
return new Pair(a, b);
7+
public static <A, B> Pair<A, B> pair(A a, B b) {
8+
return new Pair<>(a, b);
99
}
1010

1111
public A getLeft() {
@@ -19,4 +19,12 @@ public B getRight() {
1919
public<C, D> Pair<C, D> map(BiFunction<A, B, Pair<C, D>> func) {
2020
return func.apply(a(), b());
2121
}
22+
23+
@Override
24+
public int compareTo(Pair<A, B> t) {
25+
if(a instanceof Comparable && t.a instanceof Comparable) {
26+
return ((Comparable)a).compareTo(t.a);
27+
}
28+
return 0;
29+
}
2230
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.stream.Stream;
1313
import java.util.stream.StreamSupport;
1414

15+
import static com.sbaars.adventofcode.common.Pair.pair;
1516
import static java.util.stream.IntStream.range;
1617

1718
public class AOCUtils {
@@ -50,11 +51,11 @@ public static<A> A findMax(Collection<A> l, ToIntFunction<A> condition) {
5051
}
5152

5253
public static<A> Stream<Pair<A, A>> connectedPairs(List<A> l) {
53-
return range(1, l.size()).mapToObj(i -> Pair.of(l.get(i-1), l.get(i)));
54+
return range(1, l.size()).mapToObj(i -> pair(l.get(i-1), l.get(i)));
5455
}
5556

5657
public static<A> Stream<Pair<A, A>> pairs(List<A> l) {
57-
return range(1, l.size()/2).map(i -> i + ((i-1)*2)).mapToObj(i -> Pair.of(l.get(i-1), l.get(i)));
58+
return range(1, l.size()/2).map(i -> i + ((i-1)*2)).mapToObj(i -> pair(l.get(i-1), l.get(i)));
5859
}
5960

6061
public static<A> Stream<Pair<A, A>> allPairs(List<A> l) {

src/main/java/com/sbaars/adventofcode/year18/days/Day7.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.sbaars.adventofcode.year18.days;
22

33
import com.sbaars.adventofcode.common.Graph;
4+
import com.sbaars.adventofcode.common.Graph.Node;
5+
import com.sbaars.adventofcode.common.MutablePair;
46
import com.sbaars.adventofcode.common.Pair;
57
import com.sbaars.adventofcode.year18.Day2018;
68

79
import java.util.HashSet;
10+
import java.util.PriorityQueue;
811

912
import static com.sbaars.adventofcode.common.Graph.toGraph;
13+
import static com.sbaars.adventofcode.common.MutablePair.pair;
1014
import static com.sbaars.adventofcode.util.DataMapper.readString;
1115

1216
public class Day7 extends Day2018 {
@@ -22,7 +26,7 @@ public static void main(String[] args) {
2226
@Override
2327
public Object part1() {
2428
var input = input();
25-
var done = new HashSet<Graph.Node<Character>>();
29+
var done = new HashSet<Node<Character>>();
2630
StringBuilder output = new StringBuilder();
2731
while(done.size() != input.getNodes().size()) {
2832
var next = input.stream().filter(n -> !done.contains(n) && done.containsAll(n.parents())).sorted().findFirst().get();
@@ -34,7 +38,23 @@ public Object part1() {
3438

3539
@Override
3640
public Object part2() {
37-
return "";
41+
var input = input();
42+
var done = new HashSet<Node<Character>>();
43+
var queue = new PriorityQueue<MutablePair<Integer, Node<Character>>>(5);
44+
int total = 0;
45+
while(done.size() != input.getNodes().size()) {
46+
var next = input.stream().filter(n -> !done.contains(n) && queue.stream().noneMatch(p -> p.b().equals(n)) && done.containsAll(n.parents())).sorted().findFirst();
47+
if(next.isEmpty() || queue.size() == 5) {
48+
var mins = queue.poll();
49+
total += mins.a();
50+
queue.forEach(p -> p.setA(p.a() - mins.a()));
51+
done.add(mins.b());
52+
} else {
53+
var n = next.get();
54+
queue.add(pair(n.data() - 'A' + 61, n));
55+
}
56+
}
57+
return total;
3858
}
3959

4060
private Graph<Character> input() {

src/main/java/com/sbaars/adventofcode/year20/days/Day18.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.sbaars.adventofcode.common.Pair;
55
import com.sbaars.adventofcode.year20.Day2020;
66

7+
import static com.sbaars.adventofcode.common.Pair.pair;
78
import static java.util.Arrays.stream;
89

910
public class Day18 extends Day2020 implements HasRecursion {
@@ -48,7 +49,7 @@ private Pair<Long, Integer> solve(StringBuilder s, boolean part1) {
4849
leftHand = Long.parseLong(s.substring(s.length() - 1, s.length()));
4950
i = s.length() - 1;
5051
}
51-
return Pair.of(leftHand, i);
52+
return pair(leftHand, i);
5253
}
5354

5455
private long getSolution(int i, StringBuilder s, long leftHand, boolean part1) {

src/main/java/com/sbaars/adventofcode/year21/days/Day19.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import java.util.*;
99

10+
import static com.sbaars.adventofcode.common.Pair.pair;
11+
1012
public class Day19 extends Day2021 {
1113

1214
public Day19() {
@@ -62,7 +64,7 @@ protected Pair<Scanner, Loc3D[]> findScannerPositions() {
6264
for (int i = 1; i < scanners.length; i++) {
6365
result.add(orientation[i], position[i]);
6466
}
65-
return Pair.of(result, position);
67+
return pair(result, position);
6668
}
6769

6870
@Override
@@ -107,7 +109,7 @@ private Optional<Loc3D> findMatch(Scanner s) {
107109
}
108110

109111
public Optional<Pair<Scanner, Loc3D>> match(Scanner[] other) {
110-
return Arrays.stream(other).map(e -> Pair.of(e, findMatch(e))).filter(e -> e.getRight().isPresent()).map(e -> Pair.of(e.getLeft(), e.getRight().get())).findFirst();
112+
return Arrays.stream(other).map(e -> pair(e, findMatch(e))).filter(e -> e.getRight().isPresent()).map(e -> pair(e.getLeft(), e.getRight().get())).findFirst();
111113
}
112114

113115
public void add(Scanner s, Loc3D p) {

src/main/java/com/sbaars/adventofcode/year21/days/Day21.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.util.HashMap;
1010
import java.util.Map;
1111

12+
import static com.sbaars.adventofcode.common.Pair.pair;
13+
1214
public class Day21 extends Day2021 implements HasRecursion {
1315
public Day21() {
1416
super(21);
@@ -56,11 +58,11 @@ public Object part2() {
5658
}
5759

5860
private Pair<Long, Long> universes(Map<State, Pair<Long, Long>> m, State s) {
59-
Pair<Long, Long> wins = Pair.of(0L, 0L);
61+
Pair<Long, Long> wins = pair(0L, 0L);
6062
if(m.containsKey(s)) {
6163
return m.get(s);
6264
} else if(Math.max(s.score[0], s.score[1]) >= 21){
63-
return Pair.of(s.move ? 0L : 1L, s.move ? 1L : 0L);
65+
return pair(s.move ? 0L : 1L, s.move ? 1L : 0L);
6466
}
6567
for(int i = 1; i<=3; i++){
6668
for(int j = 1; j<=3; j++){
@@ -69,7 +71,7 @@ private Pair<Long, Long> universes(Map<State, Pair<Long, Long>> m, State s) {
6971
while(newTurn>10) newTurn-=10;
7072
int newScore = s.score[s.move ? 0 : 1] + newTurn;
7173
Pair<Long, Long> newWins = universes(m, new State(s.move ? newTurn : s.turn[0], s.move ? s.turn[1] : newTurn, s.move ? newScore : s.score[0], s.move ? s.score[1] : newScore, !s.move));
72-
wins = Pair.of(wins.getLeft() + newWins.getLeft(), wins.getRight() + newWins.getRight());
74+
wins = pair(wins.getLeft() + newWins.getLeft(), wins.getRight() + newWins.getRight());
7375
}
7476
}
7577
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public record Location(int c, Direction d) {}
4848
new Location(4, NORTH), new Location(0, WEST),
4949
new Location(4, WEST), new Location(1, WEST)
5050
).entrySet().stream() // This stream makes the map bidirectional
51-
.flatMap(e -> Stream.of(Pair.of(e.getKey(), e.getValue()), Pair.of(e.getValue(), e.getKey())))
51+
.flatMap(e -> Stream.of(Pair.pair(e.getKey(), e.getValue()), Pair.pair(e.getValue(), e.getKey())))
5252
.collect(Collectors.toMap(Pair::a, Pair::b));
5353

5454
@Override

0 commit comments

Comments
 (0)