Снова AoC — и снова начат с опозданием. Дуплет! Основная идея прежняя — решать в jshell
, пока это не станет слишком многословным. Экономия на буковках, в общем.
Обвязка для загрузки условий задачи — та же, что для AoC-2022. Тег для задачек 2023 года — adventofcode-2023 (или раздел Problem Solving).
Первая часть загадки первого дня
Достаточно простое и короткое получилось решение, отлично сработало для первой части пазла — и практически никак не подошло для второй. Оставляю «для истории».
// Only part 1 solution
static void day1(String puzzleInputUri) throws IOException, InterruptedException {
var result = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines()).body()
.map(String::chars)
.map(IntStream::boxed)
.map(codePoints -> {
List<String> digits = codePoints
.filter(Character::isDigit)
.map(Character::toString)
.toList();
return digits.getFirst() + digits.getLast();
})
.mapToInt(Integer::parseInt)
.sum();
System.out.println(result);
}
Часть вторая и универсальное решение
Но совсем бесполезным решение для первой части назвать нельзя — оно легло в основу универсального решения.
// Universal solution
static void day1(String puzzleInputUri) throws IOException, InterruptedException {
Map<String, String> digits = Map.of(
"1", "one",
"2", "two",
"3", "three",
"4", "four",
"5", "five",
"6", "six",
"7", "seven",
"8", "eight",
"9", "nine"
);
TreeMap<Integer, String> firstLast = new TreeMap<>();
var result = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines()).body()
.map(string -> {
firstLast.clear();
digits.forEach((digit, numeric) -> {
firstLast.put(string.indexOf(digit), digit);
firstLast.put(string.lastIndexOf(digit), digit);
firstLast.put(string.indexOf(numeric), digit);
firstLast.put(string.lastIndexOf(numeric), digit);
}
);
firstLast.remove(-1); // not matched substrings index
return firstLast.firstEntry().getValue() + firstLast.lastEntry().getValue();
})
.mapToInt(Integer::parseInt)
.sum();
System.out.println(result);
}
Жаль, что (для экономии буковок) — не удалось отыскать где-нибудь в недрах стандартной библиотеки готовых привязок цифр к числительным. Хотя и ожидаемо.
Загадка первого дня была не слишком сложной, но поначалу пошла туговато на фоне повседневного «перекладывания жысонов«.
Тем полезней переключаться! Участвуй!
https://adventofcode.com/2023/day/1