-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathDay9.java
60 lines (51 loc) · 1.79 KB
/
Day9.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.sbaars.adventofcode.year21.days;
import com.sbaars.adventofcode.common.HasRecursion;
import com.sbaars.adventofcode.common.grid.NumGrid;
import com.sbaars.adventofcode.year21.Day2021;
import java.awt.*;
import java.util.HashSet;
import java.util.Set;
import static com.sbaars.adventofcode.common.Direction.fourDirections;
import static java.lang.Math.toIntExact;
import static java.util.Arrays.stream;
import static java.util.Collections.reverseOrder;
public class Day9 extends Day2021 implements HasRecursion {
public Day9() {
super(9);
}
public static void main(String[] args) {
new Day9().printParts();
}
@Override
public Object part1() {
NumGrid in = new NumGrid(day(), "\n", "");
var grid = in.grid;
return in.stream()
.filter(p -> isLowPoint(grid, p))
.mapToLong(p -> 1 + grid[p.x][p.y])
.sum();
}
@Override
public Object part2() {
NumGrid in = new NumGrid(day(), "\n", "");
var grid = in.grid;
return in.stream()
.filter(p -> isLowPoint(grid, p))
.map(p -> findBasins(new HashSet<>(), in, p, -1))
.sorted(reverseOrder())
.limit(3)
.reduce((a, b) -> a * b)
.get();
}
private boolean isLowPoint(long[][] in, Point loc) {
return stream(fourDirections()).map(d -> d.getInGrid(in, loc, -1)).filter(n -> n != -1).allMatch(n -> n > in[loc.x][loc.y]);
}
private int findBasins(Set<Point> illegal, NumGrid in, Point loc, int height) {
int amount = 0;
if (in.get(loc) != -1 && !illegal.contains(loc) && in.get(loc) > height && in.get(loc) < 9) {
amount += stream(fourDirections()).map(d -> d.move(loc)).filter(e -> in.get(loc) != -1).mapToInt(p -> findBasins(illegal, in, p, toIntExact(in.get(loc)))).sum() + 1;
illegal.add(loc);
}
return amount;
}
}