2
2
3
3
import com .sbaars .adventofcode .year24 .Day2024 ;
4
4
5
+ import java .util .List ;
6
+ import java .util .stream .Collectors ;
7
+ import java .util .stream .IntStream ;
8
+
5
9
public class Day2 extends Day2024 {
6
10
public Day2 () {
7
11
super (2 );
@@ -13,11 +17,43 @@ public static void main(String[] args) {
13
17
14
18
@ Override
15
19
public Object part1 () {
16
- return "" ;
20
+ List <String > input = dayStream ().collect (Collectors .toList ());
21
+ return input .stream ().filter (this ::isSafeReport ).count ();
17
22
}
18
23
19
24
@ Override
20
25
public Object part2 () {
21
- return "" ;
26
+ List <String > input = dayStream ().collect (Collectors .toList ());
27
+ return input .stream ().filter (this ::isSafeWithDampener ).count ();
28
+ }
29
+
30
+ private boolean isSafeReport (String report ) {
31
+ String [] levels = report .split (" " );
32
+ for (int i = 1 ; i < levels .length ; i ++) {
33
+ int diff = Integer .parseInt (levels [i ]) - Integer .parseInt (levels [i - 1 ]);
34
+ if (Math .abs (diff ) < 1 || Math .abs (diff ) > 3 || (diff > 0 && i > 1 && Integer .parseInt (levels [i - 1 ]) < Integer .parseInt (levels [i - 2 ])) || (diff < 0 && i > 1 && Integer .parseInt (levels [i - 1 ]) > Integer .parseInt (levels [i - 2 ]))) {
35
+ return false ;
36
+ }
37
+ }
38
+ return true ;
39
+ }
40
+
41
+ private boolean isSafeWithDampener (String report ) {
42
+ if (isSafeReport (report )) {
43
+ return true ;
44
+ }
45
+ String [] levels = report .split (" " );
46
+ return IntStream .range (0 , levels .length )
47
+ .anyMatch (i -> isSafeReport (removeLevel (levels , i )));
48
+ }
49
+
50
+ private String removeLevel (String [] levels , int index ) {
51
+ StringBuilder sb = new StringBuilder ();
52
+ for (int i = 0 ; i < levels .length ; i ++) {
53
+ if (i != index ) {
54
+ sb .append (levels [i ]).append (" " );
55
+ }
56
+ }
57
+ return sb .toString ().trim ();
22
58
}
23
59
}
0 commit comments