2022 day 21 rust
This commit is contained in:
parent
34c916b357
commit
c35d0ddc5c
|
@ -1,3 +1,4 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
|
|
||||||
|
@ -90,15 +91,48 @@ fn solve1(data: &[Monkey]) -> i64 {
|
||||||
finished["root"]
|
finished["root"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn go_back<'data, 'a>(
|
||||||
|
finished: &'a HashMap<&'data str, i64>,
|
||||||
|
awaiting: &'a HashMap<&'data str, Shout<'data>>,
|
||||||
|
blocker: &'data str,
|
||||||
|
required: i64,
|
||||||
|
) -> i64 {
|
||||||
|
if blocker == "humn" { return required };
|
||||||
|
match awaiting[blocker] {
|
||||||
|
Shout::LazyOp(l, op, r) => {
|
||||||
|
match (finished.get(l), finished.get(r)) {
|
||||||
|
(Some(&l), None) => {
|
||||||
|
let next = match op {
|
||||||
|
Op::Add => required - l,
|
||||||
|
Op::Sub => l - required,
|
||||||
|
Op::Mul => required / l,
|
||||||
|
Op::Div => l / required,
|
||||||
|
};
|
||||||
|
go_back(finished, awaiting, r, next)
|
||||||
|
},
|
||||||
|
(None, Some(&r)) => {
|
||||||
|
let next = match op {
|
||||||
|
Op::Add => required - r,
|
||||||
|
Op::Sub => required + r,
|
||||||
|
Op::Mul => required / r,
|
||||||
|
Op::Div => required * r,
|
||||||
|
};
|
||||||
|
go_back(finished, awaiting, l, next)
|
||||||
|
},
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn solve2(data: &[Monkey]) -> i64 {
|
fn solve2(data: &[Monkey]) -> i64 {
|
||||||
let mut finished = HashMap::new();
|
let mut finished = HashMap::new();
|
||||||
let mut awaiting = HashMap::new();
|
let mut awaiting = HashMap::new();
|
||||||
let mut dependees = HashMap::new();
|
let mut dependees = HashMap::new();
|
||||||
|
|
||||||
for monkey in data {
|
for monkey in data {
|
||||||
if monkey.name == "humn" {
|
if monkey.name == "humn" { continue };
|
||||||
continue
|
|
||||||
};
|
|
||||||
match monkey.shout {
|
match monkey.shout {
|
||||||
Shout::Number(n) => {
|
Shout::Number(n) => {
|
||||||
finished.insert(monkey.name, n);
|
finished.insert(monkey.name, n);
|
||||||
|
@ -121,11 +155,14 @@ fn solve2(data: &[Monkey]) -> i64 {
|
||||||
|
|
||||||
match awaiting["root"] {
|
match awaiting["root"] {
|
||||||
Shout::LazyOp(l, _, r)=> {
|
Shout::LazyOp(l, _, r)=> {
|
||||||
println!("hi");
|
match (finished.get(l), finished.get(r)) {
|
||||||
|
(Some(l), None) => go_back(&finished, &awaiting, r, *l),
|
||||||
|
(None, Some(r)) => go_back(&finished, &awaiting, l, *r),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
},
|
},
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
}
|
||||||
2
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -184,7 +221,6 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn part2() {
|
fn part2() {
|
||||||
let data = parse_data(DATA);
|
assert_eq!(301, solve2(&parse_data(DATA)));
|
||||||
assert_eq!(2, solve2(&data));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue