2022 day 21 rust

This commit is contained in:
Maciej Jur 2022-12-21 15:10:03 +01:00
parent e86dbd2e65
commit ceed72f731

View file

@ -19,12 +19,12 @@ enum Op {
} }
impl Op { impl Op {
fn apply(&self, a: i64, b: i64) -> i64 { fn apply(&self, l: i64, r: i64) -> i64 {
match self { match self {
Op::Add => a + b, Op::Add => l + r,
Op::Sub => a - b, Op::Sub => l - r,
Op::Mul => a * b, Op::Mul => l * r,
Op::Div => a / b, Op::Div => l / r,
} }
} }
} }
@ -49,13 +49,13 @@ fn chain_eval<'data, 'a>(
) { ) {
for &dependee in dependees.get(start).unwrap_or(&vec![]) { for &dependee in dependees.get(start).unwrap_or(&vec![]) {
if let Some(&Shout::LazyOp(l, op, r)) = awaiting.get(dependee) { if let Some(&Shout::LazyOp(l, op, r)) = awaiting.get(dependee) {
match (finished.contains_key(l), finished.contains_key(r)) { match (finished.get(l), finished.get(r)) {
(true, true) => { (Some(&l), Some(&r)) => {
finished.insert(dependee, op.apply(finished[l], finished[r])); finished.insert(dependee, op.apply(l, r));
awaiting.remove(dependee); awaiting.remove(dependee);
chain_eval(dependee, dependees, awaiting, finished); chain_eval(dependee, dependees, awaiting, finished);
} }
_ => {}, _ => (),
}; };
} }
} }
@ -76,9 +76,9 @@ fn eval<'data, const SKIP_HUMAN: bool>(
chain_eval(monkey.name, &dependees, &mut awaiting, &mut finished); chain_eval(monkey.name, &dependees, &mut awaiting, &mut finished);
}, },
Shout::LazyOp(l, op, r) => Shout::LazyOp(l, op, r) =>
match (finished.contains_key(l), finished.contains_key(r)) { match (finished.get(l), finished.get(r)) {
(true, true) => { (Some(&l), Some(&r)) => {
finished.insert(monkey.name, op.apply(finished[l], finished[r])); finished.insert(monkey.name, op.apply(l, r));
chain_eval(monkey.name, &dependees, &mut awaiting, &mut finished); chain_eval(monkey.name, &dependees, &mut awaiting, &mut finished);
} }
_ => { _ => {
@ -166,9 +166,7 @@ fn parse_data<T: AsRef<str>>(data: &[T]) -> Vec<Monkey> {
Shout::LazyOp(operands.next().unwrap(), op, operands.nth(1).unwrap()) Shout::LazyOp(operands.next().unwrap(), op, operands.nth(1).unwrap())
} }
}; };
Monkey { Monkey { name, shout }
name, shout
}
}) })
.collect() .collect()
} }