Skip to content

Commit 02445cc

Browse files
committed
java/2016/20: add solution for part 2
1 parent 7bb296a commit 02445cc

File tree

2 files changed

+39
-37
lines changed
  • java/src
    • main/java/com/github/saser/adventofcode/year2016/day20
    • test/java/com/github/saser/adventofcode/year2016/day20

2 files changed

+39
-37
lines changed

java/src/main/java/com/github/saser/adventofcode/year2016/day20/Day20.java

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.BufferedReader;
44
import java.io.Reader;
5+
import java.util.ArrayList;
56
import java.util.Comparator;
67
import java.util.List;
78
import java.util.stream.Collectors;
@@ -21,8 +22,15 @@ public static Result part2(Reader r) {
2122

2223
private static Result solve(Reader r, int part) {
2324
var intervals = parse(r);
24-
var answer = firstAvailable(intervals);
25-
return Result.ok(Long.toString(answer));
25+
var available = toAvailable(intervals);
26+
if (part == 1) {
27+
var first = available.get(0);
28+
return Result.ok(Long.toString(first.v1));
29+
}
30+
var sum = available.stream()
31+
.mapToLong(interval -> interval.v2 - interval.v1)
32+
.sum();
33+
return Result.ok(Long.toString(sum));
2634
}
2735

2836
private static List<Tuple2<Long, Long>> parse(Reader r) {
@@ -37,31 +45,34 @@ private static List<Tuple2<Long, Long>> parse(Reader r) {
3745
.collect(Collectors.toUnmodifiableList());
3846
}
3947

40-
private static long firstAvailable(List<Tuple2<Long, Long>> intervals) {
41-
var sorted = intervals.stream()
42-
.flatMap(tuple -> {
43-
var start = tuple.v1;
44-
var end = tuple.v2;
45-
return Stream.of(new Tuple2<>(start, false), new Tuple2<>(end + 1, true));
46-
})
47-
.sorted(Comparator.<Tuple2<Long, Boolean>, Long>comparing(tuple -> tuple.v1)
48-
.thenComparing(tuple -> tuple.v2));
48+
private static List<Tuple2<Long, Long>> toAvailable(List<Tuple2<Long, Long>> blocked) {
49+
var sorted = blocked.stream()
50+
.flatMap(interval -> Stream.of(new Tuple2<>(interval.v1, false), new Tuple2<>(interval.v2 + 1, true)))
51+
.sorted(Comparator.<Tuple2<Long, Boolean>, Long>comparing(edge -> edge.v1)
52+
.thenComparing(edge -> edge.v2));
4953
var it = sorted.iterator();
50-
if (it.next().v1 > 0) {
51-
return 0;
52-
}
53-
var depth = 1;
54+
var available = new ArrayList<Tuple2<Long, Long>>();
55+
long start = 0;
56+
var depth = 0;
5457
while (it.hasNext()) {
55-
var element = it.next();
56-
if (element.v2) {
58+
var edge = it.next();
59+
var value = edge.v1;
60+
var isEnd = edge.v2;
61+
if (isEnd) {
5762
depth--;
5863
if (depth == 0) {
59-
return element.v1;
64+
start = value;
6065
}
6166
} else {
6267
depth++;
68+
if (depth == 1) {
69+
available.add(new Tuple2<>(start, value));
70+
}
6371
}
6472
}
65-
return -1;
73+
available.add(new Tuple2<>(start, (1L << 32) - 1));
74+
return available.stream()
75+
.filter(interval -> interval.v2 > interval.v1)
76+
.collect(Collectors.toUnmodifiableList());
6677
}
6778
}

java/src/test/java/com/github/saser/adventofcode/year2016/day20/Day20Test.java

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,13 @@ public void part1Actual() throws IOException {
2727
}
2828
}
2929

30-
// @Test
31-
// public void part2Example() {
32-
// var input = new StringReader("");
33-
// var output = "";
34-
// var result = Day20.part2(input);
35-
// Assert.assertEquals("no error", "", result.error);
36-
// Assert.assertEquals("correct output", output, result.answer);
37-
// }
38-
39-
// @Test
40-
// public void part2Actual() throws IOException {
41-
// try (var input = new FileReader("inputs/2016/20")) {
42-
// var output = "";
43-
// var result = Day20.part2(input);
44-
// Assert.assertEquals("no error", "", result.error);
45-
// Assert.assertEquals("correct output", output, result.answer);
46-
// }
47-
// }
30+
@Test
31+
public void part2Actual() throws IOException {
32+
try (var input = new FileReader("inputs/2016/20")) {
33+
var output = "";
34+
var result = Day20.part2(input);
35+
Assert.assertEquals("no error", "", result.error);
36+
Assert.assertEquals("correct output", output, result.answer);
37+
}
38+
}
4839
}

0 commit comments

Comments
 (0)