Первая часть задачки из третьего дня оказалась неожиданно простой в решении. По ощущениям — проще заданий дня второго.
А вот во второй пришлось вернуться к корням 🙂 Через стрим получался этакий монстроузорный коллектор для группировки по три строки, что ну его на фиг. Через циклы тоже не конфетка, но тут этого и не нужно. Ответ — есть!
static void day3(String puzzleInputUri) throws IOException, InterruptedException {
int lowerCaseOffset = 96;
int upperCaseOffset = 38;
var resultPartOne = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines())
.body()
.map(backpack -> Map.entry(
Arrays.stream(backpack.substring(0, backpack.length() / 2)
.split("")).collect(Collectors.toSet()),
Arrays.stream(backpack.substring(backpack.length() / 2)
.split("")).collect(Collectors.toSet())
))
.map(pockets -> {
pockets.getKey().retainAll(pockets.getValue());
return pockets.getKey();
})
.flatMap(Collection::stream)
.mapToInt(item -> {
int charCode = item.codePointAt(0);
return Character.isUpperCase(charCode)
? charCode - upperCaseOffset
: charCode - lowerCaseOffset;
})
.sum();
System.out.println(resultPartOne);
List<String> src = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines())
.body().collect(Collectors.toList());
Integer resultPartTwo = 0;
Map<String, Integer> groupOfThree = new HashMap<>();
for (String backpack : src) {
if (!groupOfThree.containsValue(3)) {
for (String item : Arrays.stream(backpack.split("")).collect(Collectors.toSet())) {
groupOfThree.merge(item, 1, Integer::sum);
}
}
if (groupOfThree.containsValue(3)) {
resultPartTwo += groupOfThree.entrySet().stream()
.filter(e -> e.getValue() == 3)
.map(Entry::getKey)
.mapToInt(item -> {
int charCode = item.codePointAt(0);
return Character.isUpperCase(charCode)
? charCode - upperCaseOffset
: charCode - lowerCaseOffset;
})
.sum();
groupOfThree = new HashMap<>();
}
}
System.out.println(resultPartTwo);
}
Исходные данные: https://adventofcode.com/2022/day/3/input