2
2
3
3
import java .io .BufferedReader ;
4
4
import java .io .Reader ;
5
+ import java .util .ArrayList ;
5
6
import java .util .Comparator ;
6
7
import java .util .List ;
7
8
import java .util .stream .Collectors ;
@@ -21,8 +22,15 @@ public static Result part2(Reader r) {
21
22
22
23
private static Result solve (Reader r , int part ) {
23
24
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 ));
26
34
}
27
35
28
36
private static List <Tuple2 <Long , Long >> parse (Reader r ) {
@@ -37,31 +45,34 @@ private static List<Tuple2<Long, Long>> parse(Reader r) {
37
45
.collect (Collectors .toUnmodifiableList ());
38
46
}
39
47
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 ));
49
53
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 ;
54
57
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 ) {
57
62
depth --;
58
63
if (depth == 0 ) {
59
- return element . v1 ;
64
+ start = value ;
60
65
}
61
66
} else {
62
67
depth ++;
68
+ if (depth == 1 ) {
69
+ available .add (new Tuple2 <>(start , value ));
70
+ }
63
71
}
64
72
}
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 ());
66
77
}
67
78
}
0 commit comments