diff --git a/java/src/main/java/day3/Main.java b/java/src/main/java/day3/Main.java new file mode 100644 index 0000000..01978b0 --- /dev/null +++ b/java/src/main/java/day3/Main.java @@ -0,0 +1,100 @@ +package day3; + +import io.vavr.Tuple; +import io.vavr.Tuple2; +import io.vavr.collection.List; +import io.vavr.collection.Set; +import util.FileReader; + +public class Main { + + public static void main(String[] args) { + String inputFilePath = System.getProperty("user.dir") + "\\java\\src\\main\\java\\day3\\input.txt"; + FileReader reader = new FileReader(inputFilePath); + List inputData = List.ofAll(reader.readContents()); + + Set symbolsPositions = inputData + .zipWithIndex() + .toMap(Tuple2::swap) + .mapValues(String::toCharArray) + .mapValues(List::ofAll) + .mapValues(charArray -> charArray + .zipWithIndex() + .toMap(Tuple2::swap) + .filterValues(character -> '.' != character) + .filterValues(character -> !Character.isDigit(character)) + .keySet().toList() + ).map((lineIndex, columnIndexes) -> Tuple.of(lineIndex, columnIndexes + .map(columnIndex -> new Position(lineIndex, columnIndex)) + ) + ).values().toSet() + .flatMap(set -> set); + + List> numbersPositions = inputData + .zipWithIndex() + .toMap(Tuple2::swap) + .mapValues(String::toCharArray) + .mapValues(List::ofAll) + .mapValues(charArray -> charArray + .zipWithIndex() + .toMap(Tuple2::swap) + .filterValues(Character::isDigit) + .keySet().toList() + ) + .mapValues(Main::groupConsecutiveNumbers) + .map((lineIndex, groupedNumbersColumnIndexes) -> Tuple.of(lineIndex, groupedNumbersColumnIndexes + .map(columnIndexes -> columnIndexes.map(columnIndex -> new Position(lineIndex, columnIndex))) + ) + ).values().toList().flatMap(list -> list); + + Integer sumOfValidParts = numbersPositions.filter(positions -> + !positions.filter(numberPosition -> + !symbolsPositions + .filter(symbolPosition -> symbolPosition.isAdjacent(numberPosition)) + .isEmpty() + ).isEmpty() + ).map(positions -> transformDigitsPositionsToNumber(positions, inputData)) + .reduce(Integer::sum); + + System.out.println(sumOfValidParts); + + Integer gearRatiosSum = symbolsPositions.toList() + .filter(position -> inputData.get(position.line).charAt(position.column) == '*') + .map(symbolPosition -> numbersPositions + .filter(numberPositions -> !numberPositions.filter(symbolPosition::isAdjacent).isEmpty()) + ).filter(adjacentNumberList -> adjacentNumberList.length() == 2) + .map(adjacentNumberPositions -> adjacentNumberPositions.map(positions -> transformDigitsPositionsToNumber(positions, inputData))) + .map(adjacentNumbers -> adjacentNumbers.get(0) * adjacentNumbers.get(1)) + .reduce(Integer::sum); + + System.out.println(gearRatiosSum); + } + + private static Integer transformDigitsPositionsToNumber(List digitsPositions, List inputData) { + return digitsPositions + .map(position -> inputData + .get(position.line) + .charAt(position.column) + ).map(String::valueOf) + .map(Integer::parseInt) + .reduce((accumulator, value) -> 10 * accumulator + value); + } + + private static List> groupConsecutiveNumbers(List numbers) { + List sortedNumbers = numbers.sorted(); + List> groupedNumbers = List.empty(); + + List temp = List.empty(); + temp = temp.append(sortedNumbers.get(0)); + + for (int index = 0; index < sortedNumbers.size() - 1; index++) { + if (sortedNumbers.get(index + 1) != sortedNumbers.get(index) + 1) { + groupedNumbers = groupedNumbers.append(temp); + temp = List.empty(); + } + temp = temp.append(sortedNumbers.get(index + 1)); + } + + return groupedNumbers.append(temp); + } +} diff --git a/java/src/main/java/day3/Position.java b/java/src/main/java/day3/Position.java new file mode 100644 index 0000000..2ffc3e8 --- /dev/null +++ b/java/src/main/java/day3/Position.java @@ -0,0 +1,15 @@ +package day3; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class Position { + Integer line; + Integer column; + + public boolean isAdjacent(Position other) { + int columnsDiff = Math.abs(this.column - other.column); + int linesDiff = Math.abs(this.line - other.line); + return columnsDiff <= 1 && linesDiff <= 1; + } +} \ No newline at end of file