Add day 21
This commit is contained in:
		| @@ -88,4 +88,9 @@ path = "src/day19/main.rs" | ||||
| [[bin]] | ||||
| name = "day20" | ||||
| path = "src/day20/main.rs" | ||||
|  | ||||
| [[bin]] | ||||
| name = "day21" | ||||
| path = "src/day21/main.rs" | ||||
|  | ||||
| [dependencies] | ||||
|   | ||||
							
								
								
									
										0
									
								
								day18_test.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								day18_test.txt
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										15
									
								
								day21_test.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								day21_test.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| root: pppw + sjmn | ||||
| dbpl: 5 | ||||
| cczh: sllz + lgvd | ||||
| zczc: 2 | ||||
| ptdq: humn - dvpt | ||||
| dvpt: 3 | ||||
| lfqf: 4 | ||||
| humn: 5 | ||||
| ljgn: 2 | ||||
| sjmn: drzm * dbpl | ||||
| sllz: 4 | ||||
| pppw: cczh / lfqf | ||||
| lgvd: ljgn * ptdq | ||||
| drzm: hmdt - zczc | ||||
| hmdt: 32 | ||||
							
								
								
									
										90
									
								
								src/day21/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/day21/main.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| use std::collections::HashMap; | ||||
| use base::read_file; | ||||
|  | ||||
| #[derive(Clone, Debug)] | ||||
| enum UnparsedOp { | ||||
|     Constant(i64), | ||||
|     Add(String, String), | ||||
|     Sub(String, String), | ||||
|     Mul(String, String), | ||||
|     Div(String, String), | ||||
| } | ||||
|  | ||||
| fn solve_op(op: &UnparsedOp, data: &HashMap<String, UnparsedOp>) -> i64 { | ||||
|     return match op { | ||||
|         UnparsedOp::Constant(number) => *number, | ||||
|         UnparsedOp::Add(f, s) => solve_op(&data[f], data) + solve_op(&data[s], data), | ||||
|         UnparsedOp::Sub(f, s) => solve_op(&data[f], data) - solve_op(&data[s], data), | ||||
|         UnparsedOp::Mul(f, s) => solve_op(&data[f], data) * solve_op(&data[s], data), | ||||
|         UnparsedOp::Div(f, s) => solve_op(&data[f], data) / solve_op(&data[s], data), | ||||
|     }; | ||||
| } | ||||
|  | ||||
| fn solve(data: &HashMap<String, UnparsedOp>) -> i64 { | ||||
|     let root = &data["root"]; | ||||
|  | ||||
|     solve_op(root, data) | ||||
| } | ||||
|  | ||||
| fn solve_eq(data: &mut HashMap<String, UnparsedOp>) -> i64 { | ||||
|     let root = data["root"].clone(); | ||||
|  | ||||
|  | ||||
|     if let UnparsedOp::Add(f, s) = root { | ||||
|         let mut guess = 0; | ||||
|         let mut add = 100000000000; | ||||
|  | ||||
|         loop { | ||||
|             let new_guess = guess + add; | ||||
|             data.insert("humn".to_owned(), UnparsedOp::Constant(new_guess)); | ||||
|             let left = solve_op(&data[&f], data); | ||||
|             let right = solve_op(&data[&s], data); | ||||
|             if left < right { | ||||
|                 add /= 10; | ||||
|             } else { | ||||
|                 guess = new_guess; | ||||
|             } | ||||
|  | ||||
|             if left == right { | ||||
|                 return guess; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } else { | ||||
|         panic!("Can't handle this"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn main() { | ||||
|     let lines = read_file("day21.txt"); | ||||
|     let mut data = HashMap::new(); | ||||
|  | ||||
|     for line in lines { | ||||
|         let splits = line.split(": ").collect::<Vec<_>>(); | ||||
|         let name = splits[0]; | ||||
|         if let Ok(number) = splits[1].parse::<i64>() { | ||||
|             data.insert(name.to_owned(), UnparsedOp::Constant(number)); | ||||
|         } else { | ||||
|             let split_op = splits[1].split_whitespace().collect::<Vec<_>>(); | ||||
|             let first = split_op[0].to_owned(); | ||||
|             let second = split_op[2].to_owned(); | ||||
|  | ||||
|             data.insert(name.to_owned(), match split_op[1].chars().next().unwrap() { | ||||
|                 '+' => UnparsedOp::Add(first, second), | ||||
|                 '-' => UnparsedOp::Sub(first, second), | ||||
|                 '*' => UnparsedOp::Mul(first, second), | ||||
|                 '/' => UnparsedOp::Div(first, second), | ||||
|                 _ => { | ||||
|                     panic!("Unknown operation"); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     let result = solve(&data); | ||||
|     println!("Task1: {}", result); | ||||
|  | ||||
|  | ||||
|     let result = solve_eq(&mut data); | ||||
|     println!("Task2: {}", result); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user