{"id":14285,"url":"\/distributions\/14285\/click?bit=1&hash=346f3dd5dee2d88930b559bfe049bf63f032c3f6597a81b363a99361cc92d37d","title":"\u0421\u0442\u0438\u043f\u0435\u043d\u0434\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f","buttonText":"","imageUuid":""}

Advent of Code 2022: Day 20

Настало Появилось время продолжить AoC за, уже оставшийся в прошлом, 2022 год.

Задачка двадцатого дня была чем-то похожа на обезьяньи игры — потому не вызвала слишком много затруднений.

Упростить решение помогло наличие библиотечного метода Math.floorMod (про который я вычитал в треде на реддите).

Перемешивание координат

static void mix(List<Map.Entry<Integer, Long>> mixed, List<Map.Entry<Integer, Long>> reference) { for (var coordinate : reference) { int idx = mixed.indexOf(coordinate); mixed.remove(idx); int newIdx = Math.floorMod(idx + coordinate.getValue(), mixed.size()); mixed.add(newIdx, coordinate); } }

ЕМНИП, получилось нечто вроде двойного хэширования. Но с ходу приспособить что-то типа LinkedHashMap для хранения координат не удалось, а дольше искать было лень. Так что — остановился на списках.

Вычисление результата

static void day20(String puzzleInputUri) throws IOException, InterruptedException { long key = 811589153; // 1 for part 1 int mixes = 10; // 1 for part 1 AtomicInteger idx = new AtomicInteger(0); var encrypted = client.send(request.uri((URI.create(puzzleInputUri))).build(), BodyHandlers.ofLines()) .body() .map(coord -> Map.entry(idx.getAndIncrement(), Long.parseLong(coord) * key)) .collect(Collectors.toList()); var reference = new ArrayList<>(encrypted); for (int i = 0; i < mixes; i++) { mix(encrypted, reference); } encrypted.stream() .filter(c -> c.getValue() == 0) .findAny() .map(encrypted::indexOf) .map(startIdx -> IntStream.of(startIdx + 1000, startIdx + 2000, startIdx + 3000) .map(i -> i % encrypted.size()) .mapToLong(i -> encrypted.get(i).getValue()) .sum() ) .ifPresent(System.out::println); }

Надеюсь, загадки оставшихся дней будут не сильно сложнее :)

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