From 2641a35d5473beb6889b299b54de294fbf782b1f Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 7 Jul 2025 11:47:29 +0200 Subject: Day 21 2022 --- 2022/21/b.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 2022/21/b.rs (limited to '2022/21/b.rs') diff --git a/2022/21/b.rs b/2022/21/b.rs new file mode 100644 index 0000000..e674dd4 --- /dev/null +++ b/2022/21/b.rs @@ -0,0 +1,63 @@ +mod common; +use common::*; + +fn solve_for_humn(name: &str, n1: i64, monkeys: &Vec) -> i64 { + if name == "humn" { return n1; } + + let i = monkeys.iter().position(|m| m.name == name).unwrap(); + if let MonkeyType::Op(op) = &monkeys[i].kind { + if let Some(n2) = result_or_unknown(&op.m1, &monkeys) { + // n1 = n2 [op] [unknown] + match op.op { + '+' => solve_for_humn(&op.m2, n1-n2, &monkeys), + '-' => solve_for_humn(&op.m2, n2-n1, &monkeys), + '*' => solve_for_humn(&op.m2, n1/n2, &monkeys), + '/' => solve_for_humn(&op.m2, n2/n1, &monkeys), + _ => panic!("invalid operator") + } + } else { + if let Some(n2) = result_or_unknown(&op.m2, &monkeys) { + // n1 = [unknown] [op] n2 + match op.op { + '+' => solve_for_humn(&op.m1, n1-n2, &monkeys), + '-' => solve_for_humn(&op.m1, n1+n2, &monkeys), + '*' => solve_for_humn(&op.m1, n1/n2, &monkeys), + '/' => solve_for_humn(&op.m1, n1*n2, &monkeys), + _ => panic!("invalid operator") + } + } else { panic!("both sides undetermined"); } + } + } else { panic!("found number when trying to solve for humn"); } +} + +fn result_or_unknown(name: &str, monkeys: &Vec) -> Option { + if name == "humn" { return None; } + + let i = monkeys.iter().position(|m| m.name == name).unwrap(); + match &monkeys[i].kind { + MonkeyType::Num(n) => Some(*n), + MonkeyType::Op(op) => { + let n1 = result_or_unknown(&op.m1, &monkeys)?; + let n2 = result_or_unknown(&op.m2, &monkeys)?; + Some(apply_op(n1, n2, op)) + } + } +} + +pub fn solve(monkeys: &Vec) -> i64 { + let i = monkeys.iter().position(|m| m.name == "root").unwrap(); + if let MonkeyType::Op(op) = &monkeys[i].kind { + if let Some(n) = result_or_unknown(&op.m1, &monkeys) { + return solve_for_humn(&op.m2, n, monkeys); + } else { + if let Some(n) = result_or_unknown(&op.m2, &monkeys) { + return solve_for_humn(&op.m1, n, &monkeys); + } else { panic!("humn not found"); } + } + } else { panic!("root monkey is of type number"); } +} + +fn main() { + let monkeys = read_monkeys_from_stdin(); + println!("{}", solve(&monkeys)); +} -- cgit v1.3