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());
}
Исходные данные: https://adventofcode.com/2022/day/21/input

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *