summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/day7.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/bin/day7.rs b/src/bin/day7.rs
new file mode 100644
index 0000000..60b08b1
--- /dev/null
+++ b/src/bin/day7.rs
@@ -0,0 +1,50 @@
+static DAY: u8 = 7;
+
+fn main() {
+ let input = advent::read_lines(DAY);
+ println!("{DAY}a: {}", calibration_result(&input));
+ println!("{DAY}b: {}", 0);
+}
+
+fn calculateable(result: i64, operands: &[i64]) -> bool {
+ if operands.len() == 1 {
+ return result == operands[0];
+ }
+ let rem = &operands[..=operands.len()-2];
+ let op = operands[operands.len()-1];
+ calculateable(result - op, rem) || (result % op == 0 && calculateable(result / op, rem))
+}
+
+fn calibration_result(input: &[String]) -> i64 {
+ let mut sum = 0;
+ for line in input {
+ let (result, operands) = line.split_once(": ").unwrap();
+ let result = result.parse::<i64>().unwrap();
+ let operands = operands.split(" ").map(|x| x.parse::<i64>().unwrap()).collect::<Vec<_>>();
+ if calculateable(result, &operands) {
+ sum += result;
+ }
+ }
+ sum
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test() {
+ let input = [
+ "190: 10 19",
+ "3267: 81 40 27",
+ "83: 17 5",
+ "156: 15 6",
+ "7290: 6 8 6 15",
+ "161011: 16 10 13",
+ "192: 17 8 14",
+ "21037: 9 7 18 13",
+ "292: 11 6 16 20",
+ ].iter().map(|&x| String::from(x)).collect::<Vec<_>>();
+ assert_eq!(calibration_result(&input), 3749);
+ }
+}