Advent of Code 2023: Day 1: Trebuchet?!

Снова 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