aboutsummaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
Diffstat (limited to '2022')
-rw-r--r--2022/21/a.rs19
-rw-r--r--2022/21/b.rs63
-rw-r--r--2022/21/common.rs51
3 files changed, 133 insertions, 0 deletions
diff --git a/2022/21/a.rs b/2022/21/a.rs
new file mode 100644
index 0000000..297f97a
--- /dev/null
+++ b/2022/21/a.rs
@@ -0,0 +1,19 @@
1mod common;
2use common::*;
3
4pub fn calculate(name: &str, monkeys: &Vec<Monkey>) -> i64 {
5 let i = monkeys.iter().position(|m| m.name == name).unwrap();
6 match &monkeys[i].kind {
7 MonkeyType::Num(n) => *n,
8 MonkeyType::Op(op) => {
9 let n1 = calculate(&op.m1, &monkeys);
10 let n2 = calculate(&op.m2, &monkeys);
11 apply_op(n1, n2, op)
12 }
13 }
14}
15
16fn main() {
17 let monkeys = read_monkeys_from_stdin();
18 println!("{}", calculate(&"root", &monkeys));
19}
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 @@
1mod common;
2use common::*;
3
4fn solve_for_humn(name: &str, n1: i64, monkeys: &Vec<Monkey>) -> i64 {
5 if name == "humn" { return n1; }
6
7 let i = monkeys.iter().position(|m| m.name == name).unwrap();
8 if let MonkeyType::Op(op) = &monkeys[i].kind {
9 if let Some(n2) = result_or_unknown(&op.m1, &monkeys) {
10 // n1 = n2 [op] [unknown]
11 match op.op {
12 '+' => solve_for_humn(&op.m2, n1-n2, &monkeys),
13 '-' => solve_for_humn(&op.m2, n2-n1, &monkeys),
14 '*' => solve_for_humn(&op.m2, n1/n2, &monkeys),
15 '/' => solve_for_humn(&op.m2, n2/n1, &monkeys),
16 _ => panic!("invalid operator")
17 }
18 } else {
19 if let Some(n2) = result_or_unknown(&op.m2, &monkeys) {
20 // n1 = [unknown] [op] n2
21 match op.op {
22 '+' => solve_for_humn(&op.m1, n1-n2, &monkeys),
23 '-' => solve_for_humn(&op.m1, n1+n2, &monkeys),
24 '*' => solve_for_humn(&op.m1, n1/n2, &monkeys),
25 '/' => solve_for_humn(&op.m1, n1*n2, &monkeys),
26 _ => panic!("invalid operator")
27 }
28 } else { panic!("both sides undetermined"); }
29 }
30 } else { panic!("found number when trying to solve for humn"); }
31}
32
33fn result_or_unknown(name: &str, monkeys: &Vec<Monkey>) -> Option<i64> {
34 if name == "humn" { return None; }
35
36 let i = monkeys.iter().position(|m| m.name == name).unwrap();
37 match &monkeys[i].kind {
38 MonkeyType::Num(n) => Some(*n),
39 MonkeyType::Op(op) => {
40 let n1 = result_or_unknown(&op.m1, &monkeys)?;
41 let n2 = result_or_unknown(&op.m2, &monkeys)?;
42 Some(apply_op(n1, n2, op))
43 }
44 }
45}
46
47pub fn solve(monkeys: &Vec<Monkey>) -> i64 {
48 let i = monkeys.iter().position(|m| m.name == "root").unwrap();
49 if let MonkeyType::Op(op) = &monkeys[i].kind {
50 if let Some(n) = result_or_unknown(&op.m1, &monkeys) {
51 return solve_for_humn(&op.m2, n, monkeys);
52 } else {
53 if let Some(n) = result_or_unknown(&op.m2, &monkeys) {
54 return solve_for_humn(&op.m1, n, &monkeys);
55 } else { panic!("humn not found"); }
56 }
57 } else { panic!("root monkey is of type number"); }
58}
59
60fn main() {
61 let monkeys = read_monkeys_from_stdin();
62 println!("{}", solve(&monkeys));
63}
diff --git a/2022/21/common.rs b/2022/21/common.rs
new file mode 100644
index 0000000..24dc37b
--- /dev/null
+++ b/2022/21/common.rs
@@ -0,0 +1,51 @@
1#[derive(Debug)]
2pub struct Operation {
3 pub m1: String,
4 pub m2: String,
5 pub op: char
6}
7
8#[derive(Debug)]
9pub enum MonkeyType {
10 Num(i64),
11 Op(Operation)
12}
13
14#[derive(Debug)]
15pub struct Monkey {
16 pub name: String,
17 pub kind: MonkeyType
18}
19
20pub fn read_monkeys_from_stdin() -> Vec<Monkey> {
21 let mut v = vec![];
22 let mut line = String::new();
23 while std::io::stdin().read_line(&mut line).unwrap() > 0 {
24 let name = String::from(&line[0..4]);
25 let monkey = match line.chars().nth(6).unwrap() {
26 '0'..='9' => {
27 let n = line[6..line.len()-1].parse::<i64>().unwrap();
28 Monkey { name, kind: MonkeyType::Num(n) }
29 },
30 _ => {
31 let m1 = String::from(&line[6..10]);
32 let m2 = String::from(&line[13..17]);
33 let op = Operation { m1, m2, op: line.chars().nth(11).unwrap() };
34 Monkey { name, kind: MonkeyType::Op(op) }
35 }
36 };
37 v.push(monkey);
38 line.clear();
39 }
40 v
41}
42
43pub fn apply_op(n1: i64, n2: i64, op: &Operation) -> i64 {
44 match op.op {
45 '+' => n1 + n2,
46 '-' => n1 - n2,
47 '*' => n1 * n2,
48 '/' => n1 / n2,
49 _ => panic!("invalid operator")
50 }
51}

Generated with cgit - Back to sebastiano.tronto.net