1
1
package com .sbaars .adventofcode .year23 .days ;
2
2
3
+ import com .sbaars .adventofcode .common .Builder ;
4
+ import com .sbaars .adventofcode .common .Direction ;
5
+ import com .sbaars .adventofcode .common .grid .InfiniteGrid ;
6
+ import com .sbaars .adventofcode .common .location .Loc ;
3
7
import com .sbaars .adventofcode .year23 .Day2023 ;
4
8
9
+ import java .util .HashSet ;
10
+ import java .util .List ;
11
+ import java .util .Set ;
12
+
13
+ import static com .sbaars .adventofcode .common .Direction .*;
14
+ import static java .util .stream .Collectors .toSet ;
15
+
5
16
public class Day23 extends Day2023 {
6
17
public Day23 () {
7
18
super (23 );
@@ -11,13 +22,53 @@ public static void main(String[] args) {
11
22
new Day23 ().printParts ();
12
23
}
13
24
25
+ public record Path (Set <Loc > visited , Loc currentLoc ) {
26
+ }
27
+
14
28
@ Override
15
29
public Object part1 () {
16
- return "" ;
30
+ return solve ( false ) ;
17
31
}
18
32
19
33
@ Override
20
34
public Object part2 () {
21
- return "" ;
35
+ return solve (true );
36
+ }
37
+
38
+ private long solve (boolean part2 ) {
39
+ var input = new InfiniteGrid (dayGrid ());
40
+ Loc start = new Loc (1 , 0 );
41
+ Builder <Set <Path >> curr = new Builder <>(HashSet ::new );
42
+ curr .get ().add (new Path (new HashSet <>(List .of (start )), start ));
43
+ Loc target = new Loc (input .width () - 2 , input .height () - 1 );
44
+ long longest = 0 ;
45
+ while (!curr .get ().isEmpty ()) {
46
+ curr .setNew (curr .get ().parallelStream ().flatMap (path -> {
47
+ Loc loc = path .currentLoc ;
48
+ return four ()
49
+ .filter (d -> checkDir (d , input .getChar (loc ), part2 ) && checkDir (d , input .getChar (d .move (loc )), part2 ))
50
+ .map (d -> d .move (loc ))
51
+ .filter (l -> !path .visited .contains (l ))
52
+ .map (l -> new Path (new HashSet <>(path .visited ) {{
53
+ add (l );
54
+ }}, l ));
55
+ }).collect (toSet ()));
56
+ longest = Math .max (longest , curr .getNew ().stream ().mapToInt (p -> p .visited .size () - 1 ).max ().getAsInt ());
57
+ curr .getNew ().stream ().findAny ().ifPresent (x -> System .out .println (x .visited .size () + " " + curr .getNew ().size ()));
58
+ curr .getNew ().removeIf (p -> p .currentLoc .equals (target ));
59
+ curr .refresh ();
60
+ }
61
+ return longest ;
62
+ }
63
+
64
+ private boolean checkDir (Direction d , char c , boolean part2 ) {
65
+ return switch (c ) {
66
+ case '>' -> part2 || d == EAST ;
67
+ case '<' -> part2 || d == WEST ;
68
+ case '^' -> part2 || d == NORTH ;
69
+ case 'v' -> part2 || d == SOUTH ;
70
+ case '#' , 0 -> false ;
71
+ default -> true ;
72
+ };
22
73
}
23
74
}
0 commit comments