В начале была лень… Стойкое нежелание возиться с границами массивов. Оно, и только оно толкнуло меня на скользкую дорожку замены матрицы примитивов на List<List<>>
.
Следующим шагом на пути окунания в пучины многословия — стало создание контейнеров для упаковки данных со «схемы двигателя». Вот они:
public record Coord(Integer row, Integer column){};
public record Cell(Coord coord, Integer codePoint){
Set<Coord> border() {return Set.of(
new Coord(coord.row(), coord.column() - 1), // left
new Coord(coord.row() - 1, coord.column() - 1), // top-left
new Coord(coord.row() - 1, coord.column()), // top
new Coord(coord.row() - 1, coord.column() + 1), // top-right
new Coord(coord.row(), coord.column() + 1), // right
new Coord(coord.row() + 1, coord.column() + 1), // bot-right
new Coord(coord.row() + 1, coord.column()), // bottom
new Coord(coord.row() + 1, coord.column() - 1) // bot-left
);}
};
public record Part(List<Cell> cells){
public Part {
cells = List.copyOf(cells);
}
Set<Coord> border() {
return cells.stream()
.flatMap(c -> c.border().stream())
.filter(bCoord -> cells.stream()
.noneMatch(c -> bCoord.equals(c.coord())))
.collect(Collectors.toSet());
}
Integer value() {
return Integer.parseInt(cells.stream()
.map(c -> Character.toChars(c.codePoint()))
.map(String::new).collect(Collectors.joining()));
}
};
Читать далее Advent of Code 2023: Day 3: Gear Ratios →