Задачка второго дня оказалась повариативней, пришлось искать отдельные решения для первой и второй частей.
Тем не менее — они были найдены, а ответы — получены. Как обычно — решение в виде функции запускается в 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);
}
Исходные данные: https://adventofcode.com/2022/day/2/input
P.S. Как же, оказывается, тяжело воспринимается «на слух» непривычный порядок — вместо «камень/ножницы/бумага» в условиях описывается Rock Paper Scissors — несколько раз путался при мапинге стратегий, пока комментарий в «правильном» порядке не написал 😀