Advent of Code 2022: Day 2

Задачка второго дня оказалась повариативней, пришлось искать отдельные решения для первой и второй частей.

Тем не менее — они были найдены, а ответы — получены. Как обычно — решение в виде функции запускается в jshell.

static void day2(String puzzleInputUri) throws IOException, InterruptedException { /* rock: A, X scissors: C, Z paper: B, Y */ Map<String, Integer> choiceCosts = Map.of("X", 1, "Y", 2, "Z", 3); Map<Integer, Set<String>> strategyCosts = Map.of( 6, Set.of("A Y", "C X", "B Z"), //win 3, Set.of("A X", "C Z", "B Y"), //draw 0, Set.of("A Z", "C Y", "B X") //lose ); Map<String, Set<String>> strategyMappingPartTwo = Map.of( "X", strategyCosts.get(0), //lose "Y", strategyCosts.get(3), //draw "Z", strategyCosts.get(6) //win ); int totalPartOne = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines()).body() .map(round -> Map.entry(round, strategyCosts.entrySet().stream().mapToInt(entry -> entry.getValue().contains(round) ? entry.getKey() : 0).sum()) ) .mapToInt(roundWithCost -> { String choice = roundWithCost.getKey().split(" ")[1]; return roundWithCost.getValue() + choiceCosts.get(choice); }) .sum(); System.out.println(totalPartOne); int totalPartTwo = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines()).body() .map(round -> round.split(" ")) .map(choiceAndStrategy -> strategyMappingPartTwo.get(choiceAndStrategy[1]).stream() .filter(strategies -> strategies.contains(choiceAndStrategy[0])) .findAny() ) .flatMap(Optional::stream) .mapToInt(round -> { int cost = strategyCosts.entrySet().stream().mapToInt(entry -> entry.getValue().contains(round) ? entry.getKey() : 0).sum(); return cost + choiceCosts.get(round.split(" ")[1]); }) .sum(); System.out.println(totalPartTwo); }

P.S. Как же, оказывается, тяжело воспринимается "на слух" непривычный порядок - вместо "камень/ножницы/бумага" в условиях описывается Rock Paper Scissors - несколько раз путался при мапинге стратегий, пока комментарий в "правильном" порядке не написал :D

0
Комментарии
-3 комментариев
Раскрывать всегда