Advent of Code 2022: Day 21

Серия Advent of Code 2022

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

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


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());
}

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества