8000 Day 23 · AbdulRehman56/AdventOfCode-Java@150fa5a · GitHub
[go: up one dir, main page]

Skip to content

Commit 150fa5a

Browse files
committed
Day 23
1 parent 0230200 commit 150fa5a

File tree

4 files changed

+60
-6
lines changed

4 files changed

+60
-6
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ Feel free to use this repo to learn about solution directions, or fork it as a t
2828
- [Day 14](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day14.java)
2929
- [Day 15](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day15.java)
3030
- [Day 16](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day16.java)
31-
- [Day 17](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day17.java) (currently broken, will fix later™)
31+
- [Day 17](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day17.java) (
32+
currently broken, will fix later™)
3233
- [Day 18](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day18.java)
3334
- [Day 19](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day19.java)
3435
- [Day 20](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day20.java)
3536
- [Day 21](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day21.java)
3637
- [Day 22](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day22.java)
37-
- [Day 23](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day23.java)
38+
- [Day 23](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day23.java) (
39+
warning: slow)
3840
- [Day 24](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day24.java)
3941
- [Day 25](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year23/days/Day25.java)
4042

src/main/java/com/sbaars/adventofcode/network/FetchInput.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public FetchInput() {
2929
}
3030

3131
public static void main(String[] args) {
32-
new FetchInput().retrieveDay("22", "2023");
32+
new FetchInput().retrieveDay("23", "2023");
3333
}
3434

3535
private void retrieveDay(String day, String year) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ public Set<Brick> dropBricks(Collection<Brick> bricksToDrop) {
7474
bricks.getNew().addAll(new HashSet<>(bricksToDrop));
7575
while (!bricks.get().equals(bricks.getNew())) { // while loop till a fixed point is reached
7676
bricks.refresh();
77-
bricks.setNew(bricks.get().parallelStream().map(b -> b.cubes.stream().anyMatch(c -> c.z == 1 || bricks.get().stream().filter(b2 -> !b.equals(b2)).anyMatch(b2 -> b2.cubes.contains(c.move(0, 0, -1)))) ? b : new Brick(b.id, b.cubes.stream().map(c -> c.move(0, 0, -1)).toList())).collect(Collectors.toSet()));
77+
bricks.setNew(
78+
bricks.get().parallelStream().map(b -> b.cubes.stream().anyMatch(c -> c.z == 1 || bricks.get().stream().filter(b2 -> !b.equals(b2)).anyMatch(b2 -> b2.cubes.contains(c.move(0, 0, -1)))) ? b : new Brick(b.id, b.cubes.stream().map(c -> c.move(0, 0, -1)).toList())).collect(Collectors.toSet()));
7879
}
7980
return bricks.get();
8081
}
Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
package com.sbaars.adventofcode.year23.days;
22

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;
37
import com.sbaars.adventofcode.year23.Day2023;
48

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+
516
public class Day23 extends Day2023 {
617
public Day23() {
718
super(23);
@@ -11,13 +22,53 @@ public static void main(String[] args) {
1122
new Day23().printParts();
1223
}
1324

25+
public record Path(Set<Loc> visited, Loc currentLoc) {
26+
}
27+
1428
@Override
1529
public Object part1() {
16-
return "";
30+
return solve(false);
1731
}
1832

1933
@Override
2034
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+
};
2273
}
2374
}

0 commit comments

Comments
 (0)
0