Advent of Code 2022: Day 21

Снова мартышки — те, да не те. Эти позадорней, поживей, поактивней Но решение чем-то схожее — соседи, операции, кидают чиселку, занимаются эквилибристикой. Для этой загадки обвязка получилась потолще, конечно.

Мартышкины ужимки

enum Action { ADD('+', Long::sum), SUBTRACT('-', (op1, op2) -> op1 - op2), DIVIDE('/', (op1, op2) -> op1 / op2), MULTIPLY('*', (op1, op2) -> op1 * op2); final char code; final BiFunction<Long, Long, Long> func; static final Map<Character, Action> OPS = Arrays.stream(Action.values()) .collect(Collectors.toUnmodifiableMap(it -> it.code, it -> it)); Action(char code, BiFunction<Long, Long, Long> func) { this.code = code; this.func = func; } BiFunction<Long, Long, Long> invert(boolean isPrev) { switch (this) { case ADD: return (op1, op2) -> op2 - op1; case MULTIPLY: return (op1, op2) -> op2 / op1; case SUBTRACT: return isPrev ? ADD.func : this.func; case DIVIDE: return isPrev ? MULTIPLY.func : this.func; default: return null; } } }

Macaca sylvanus

static class Monkey { String name, prevName, nextName; Action action; Monkey parent, prev, next; Long number; public Monkey(String inLine) { name = inLine.substring(0, 4); if (inLine.length() == 17) { action = Action.OPS.get(inLine.charAt(11)); prevName = inLine.substring(6, 10); nextName = inLine.substring(13); } else { number = Long.valueOf(inLine.substring(6)); } } public long calcNum() { return number != null ? number : action.func.apply(prev.calcNum(), next.calcNum()); } public void setPrevNext(Map<String, Monkey> monkeys) { if ((prev = monkeys.get(prevName)) != null) { prev.parent = this; } if ((next = monkeys.get(nextName)) != null) { next.parent = this; } } long calcEquilibrium() { return "root".equals(parent.name) ? parent.getJoined(this).calcNum() : parent.action.invert(isPrev()).apply(parent.getJoined(this).calcNum(), parent.calcEquilibrium()); } boolean isPrev() { return parent.prev == this; } Monkey getJoined(Monkey monkey) { return monkey == prev ? next : prev; } }

Але-ап!

Благодаря высокому интеллекту мартышек (весь фокус они проделывают самостоятельно) — решение получилось коротеньким.

static void day21(String puzzleInputUri) throws IOException, InterruptedException { var monkeys = client.send(request.uri((URI.create(puzzleInputUri))).build(), BodyHandlers.ofLines()) .body() .map(Monkey::new) .collect(Collectors.toMap(m -> m.name, m -> m)); monkeys.forEach((name, monkey) -> monkey.setPrevNext(monkeys)); System.out.println("Answer 1: " + monkeys.get("root").calcNum()); System.out.println("Answer 2: " + monkeys.get("humn").calcEquilibrium()); }
3 комментария

почему хэштег перенаправляет на vc.ru

Автор

дошло, наконец.
а вот не знаю, кстати, почему теги при вставке - не заворачиваются автоматом на адрес dtf.
поправил вручную, спс.

1
Автор

а куда должен? это тег с vc, чтобы удобней было записи здесь по нему искать.