Advent of Code 2022: Day 3

Первая часть задачки из третьего дня оказалась неожиданно простой в решении. По ощущениям — проще заданий дня второго.

А вот во второй пришлось вернуться к корням :) Через стрим получался этакий монстроузорный коллектор для группировки по три строки, что ну его на фиг. Через циклы тоже не конфетка, но тут этого и не нужно. Ответ — есть!

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); }
11
Начать дискуссию