Day 3 implementation in Java
parent
32f529dc22
commit
d32cbd51ec
|
|
@ -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<String> inputData = List.ofAll(reader.readContents());
|
||||||
|
|
||||||
|
Set<Position> 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<List<Position>> 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<Position> digitsPositions, List<String> 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<List<Integer>> groupConsecutiveNumbers(List<Integer> numbers) {
|
||||||
|
List<Integer> sortedNumbers = numbers.sorted();
|
||||||
|
List<List<Integer>> groupedNumbers = List.empty();
|
||||||
|
|
||||||
|
List<Integer> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue